Форум программистов, компьютерный форум CyberForum.ru

Функция, возвращающая указатель на структуру - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.76
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
22.09.2012, 21:37     Функция, возвращающая указатель на структуру #1
Ребят помогите пожалуйста,как создать функцию возвращающую указатель на структуру,в общем задание звучит так:написать библиотеку для полиномов:сложение, вычитание,значение в точке.
я описываю структуру в header,массив коэффициентов и степень многочлена
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef POLINOM_MODULE_H_INCLUDED
#define POLINOM_MODULE_H_INCLUDED
struct polinom
{
    double *massiv_koef;
    int stepen_m;
}
polinom *SummaPolinomov(polinom *a,*b);
 
#endif // POLINOM_MODULE_H_INCLUDED 
а в сpp пишу вот так-это пока только сложение 
 
polinom *SummaPolinomov(polinom *a,*b)
{polinom *c=new polinom[];
    if(*a.stepen_m>*b.stepen_m){
       *c.massiv_koef=new double[*a.stepen_m];
       for (int i=0;i<*b.stepen_m;i++){
           *c.massiv_koef[i]=*a.massiv_koef[i]+*b.massiv_koef[i];}
       for(int i=*b.stepen_m;i<*a.stepen_m;i++){
           *c.massiv_koef[i]=*a.massiv_koef[i];}
}
    else{
    *c.massiv_koef=new double[*b.stepen_m];
       for (int i=0;i<*a.stepen_m;i++){
           *c.massiv_koef[i]=*b.massiv_koef[i]+*a.massiv_koef[i];}
       for(int i=*a.stepen_m;i<*b.stepen_m;i++){
           *c.massiv_koef[i]=*b.massiv_koef[i];} };
           return c;}
что не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2012, 21:37     Функция, возвращающая указатель на структуру
Посмотрите здесь:

Функция, возвращающая указатель на функцию C++
Функция возвращающая указатель на int C++
C++ Функция, возвращающая указатель
C++ Функция, возвращающая указатель
C++ Функция, возвращающая указатель на структуру
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
22.09.2012, 21:53     Функция, возвращающая указатель на структуру #2
C++
1
2
3
4
5
6
polinom *SummaPolinomov(polinom *a,*b)
{
//...
   if(*a.stepen_m>*b.stepen_m)
// ...
}
Если вы используете указатели на структуры, то для обращения к полям структуры не обязательно разыменовывать указатели. Лучше пользоваться оператором -> вот так:
C++
1
2
3
4
5
6
polinom *SummaPolinomov(polinom *a,*b)
{
//...
   if (a->stepen_m > b->stepen_m)
// ну ивезде по тексту поменять
}
А при той записи, как у вас, разыменовывается не указатель, а поле stepen_m, которое указателем не является, и, соответсвтенно, оператор разыменовывания к нему не применим.

По поводу возвращаемого значения - всё правильно.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
22.09.2012, 21:54     Функция, возвращающая указатель на структуру #3
Цитата Сообщение от Fissil Посмотреть сообщение
что не так?
для начала оформление исправте
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
22.09.2012, 21:54     Функция, возвращающая указатель на структуру #4
C++
1
*c.massiv_koef[i]=*a.massiv_koef[i]
Тут тоже должно быть так:
C++
1
c->massiv_koef[i] = a->massiv_koef[i]
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
22.09.2012, 22:18  [ТС]     Функция, возвращающая указатель на структуру #5
Компилятор показывает ошибку в обьявлении функции и говорит
error: expected constructor, destructor, or type conversion before '*' token

Добавлено через 58 секунд
polinom *SummaPolinomov(polinom *a,*b)
ошибка в этой строке
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
22.09.2012, 22:21     Функция, возвращающая указатель на структуру #6
Цитата Сообщение от Fissil Посмотреть сообщение
polinom *SummaPolinomov(polinom *a,*b)
разумеется ошибка
*b это кто???
может все таки
C++
1
polinom *SummaPolinomov(polinom *a,polinom *b)
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
22.09.2012, 22:23  [ТС]     Функция, возвращающая указатель на структуру #7
Никакой разницы,все равно
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
22.09.2012, 22:32     Функция, возвращающая указатель на структуру #8
т.е ты хочешь сказать что
Цитата Сообщение от Fissil Посмотреть сообщение
polinom *SummaPolinomov(polinom *a,*b)
и
Цитата Сообщение от ValeryS Посмотреть сообщение
polinom *SummaPolinomov(polinom *a,polinom *b)
Это одно и тоже?
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
22.09.2012, 22:36  [ТС]     Функция, возвращающая указатель на структуру #9
нет в смысле ошибка та же самая
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
22.09.2012, 22:43     Функция, возвращающая указатель на структуру #10
нет в смысле ошибка та же самая
Ошибка у тебя из-за того, что после определения структуры точку с запятой не поставил.
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
22.09.2012, 23:01  [ТС]     Функция, возвращающая указатель на структуру #11
Блин,спасибо огромное=))

Добавлено через 1 минуту
А нет,все равно пишет,что перед * ожидался идентификатор

Добавлено через 3 минуты
Нет все равно пишет,только теперь header
error: expected identifier before '*' token|
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
22.09.2012, 23:04     Функция, возвращающая указатель на структуру #12
Говорили же.
C++
1
polinom *SummaPolinomov(polinom *a,*b)
А надо:
C++
1
polinom *SummaPolinomov(polinom *a,polinom*b)
Добавлено через 1 минуту
А сама функция должна быть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
polinom *SummaPolinomov(polinom *a,polinom*b)
{
    polinom *c=new polinom[];
    if (a->stepen_m > b->stepen_m)
    {
        c->massiv_koef=new double[a->stepen_m];
        for (int i=0;i<b->stepen_m;i++){
            c->massiv_koef[i]=a->massiv_koef[i]+b->massiv_koef[i];}
        for(int i=b->stepen_m;i<a->stepen_m;i++){
            c->massiv_koef[i]=a->massiv_koef[i];}
    } else
    {
        c->massiv_koef=new double[b->stepen_m];
        for (int i=0;i<a->stepen_m;i++)
            c->massiv_koef[i]=b->massiv_koef[i]+a->massiv_koef[i];
        for(int i=a->stepen_m;i<b->stepen_m;i++)
            c->massiv_koef[i]=b->massiv_koef[i];
    };
    return c;
}
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
22.09.2012, 23:06  [ТС]     Функция, возвращающая указатель на структуру #13
Да-Да я абсолютно все исправил,в обычном проекте работает,а когда в библиотеке то нет
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
22.09.2012, 23:08     Функция, возвращающая указатель на структуру #14
Цитата Сообщение от Fissil Посмотреть сообщение
в обычном проекте работает,а когда в библиотеке то нет
Что ты имеешь ввиду под "обычным проектом" и "библиотекой"?
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
22.09.2012, 23:10  [ТС]     Функция, возвращающая указатель на структуру #15
Все-все,я разобрался,спасибо вам большое,я просто еще совсем нуб в проганье))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2012, 22:50     Функция, возвращающая указатель на структуру
Еще ссылки по теме:

Структура и функция, возвращающая указатель на структуру C++
C++ Функция, возвращающая умный указатель
C++ Функция, возвращающая указатель на двумерный массив

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
05.10.2012, 22:50  [ТС]     Функция, возвращающая указатель на структуру #16
Ребят вылезла проблема,я уже голову сломал
Не работает сумма(разность) полиномов когда один(или оба) полинома нулевой степени
помогите пожалуйста вот библиотека


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include"polinom_module.h"
#include <cmath>
#include<iostream>
using namespace std;
//#include "TXLib.h"
 
 
 
double gorner(double x,double  *massiv_koef ,int i, int stepen_m)
{
    if (i+1 < stepen_m)
        return gorner(x,massiv_koef,i+1,stepen_m)*x + massiv_koef[i];
    else
        return massiv_koef[stepen_m]*x + massiv_koef[i];
}
 
polinom *SummaPolinomov(polinom *a,polinom*b)
{
    polinom *c=new polinom;
    if(a->stepen_m>=b->stepen_m)
    {
        c->massiv_koef=new double[a->stepen_m+1];
        c->stepen_m=a->stepen_m;
        for (int i=0; i<b->stepen_m+1; i++)
        {   cout<<'1'<<endl;
            c->massiv_koef[i]=a->massiv_koef[i]+b->massiv_koef[i];
        }   cout<<'2';
        for(int i=b->stepen_m+1; i<a->stepen_m+1; i++)
        {
            c->massiv_koef[i]=a->massiv_koef[i];
        }
        if (c->massiv_koef[c->stepen_m]==0)
        {
            c->stepen_m=c->stepen_m-1;
        }
 
    }
 
    if (a->stepen_m<b->stepen_m)
    {   cout<<"1";
        c->massiv_koef=new double[b->stepen_m+1];
        c->stepen_m=b->stepen_m;
        for (int i=0; i<a->stepen_m+1; i++)
        {
            c->massiv_koef[i]=a->massiv_koef[i]+b->massiv_koef[i];
            cout<<c->massiv_koef[i]<<endl;
        }
        for(int i=a->stepen_m+1; i<b->stepen_m+1; i++)
        {
            c->massiv_koef[i]=b->massiv_koef[i];
        }
    }
    return c;
}
 
polinom *RaznostPolinomov(polinom *a,polinom*b)
{
    polinom *c=new polinom;
    if(a->stepen_m>=b->stepen_m)
    {
        c->massiv_koef=new double[a->stepen_m+1];
        c->stepen_m=a->stepen_m;
        for (int i=0; i<b->stepen_m+1; i++)
        {
            c->massiv_koef[i]=a->massiv_koef[i]-b->massiv_koef[i];
        }
        for(int i=b->stepen_m+1; i<a->stepen_m+1; i++)
        {
            c->massiv_koef[i]=a->massiv_koef[i];
        }
        if (c->massiv_koef[c->stepen_m]==0)
        {
            c->stepen_m=c->stepen_m-1;
        }
    }
    else
    {
        c->massiv_koef=new double[b->stepen_m+1];
        c->stepen_m=b->stepen_m;
        for (int i=0; i<a->stepen_m+1; i++)
        {
            c->massiv_koef[i]=b->massiv_koef[i]-a->massiv_koef[i];
        }
        for(int i=a->stepen_m+1; i<b->stepen_m+1; i++)
        {
            c->massiv_koef[i]=b->massiv_koef[i];
        }
    }
    return c;
}
 
polinom *ProizPolinomov(polinom *a,polinom*b)
{
    polinom *c=new polinom;
    c->stepen_m=(a->stepen_m)+(b->stepen_m);
    c->massiv_koef=new double[c->stepen_m+1];
    for (int k=0; k<c->stepen_m+1; k++)
    {
        c->massiv_koef[k]=0;
        //cout<<"Y"<<endl;
    }
    for(int i=0; i<=(a->stepen_m)+(b->stepen_m)+1; i++)
    {
        for(int j=0; j<=i; j++)
        {
            c->massiv_koef[i]=c->massiv_koef[i]+(a->massiv_koef[j])*(b->massiv_koef[i-j]);
        };
    };
    return c;
 
}
 
double Znach(polinom *a,double x)
{
    if(a->stepen_m==0)
    {
        return a->massiv_koef[0];
    }
    return gorner(x,a->massiv_koef ,0, a->stepen_m);
}
 
polinom * Diff(polinom *a)
{
    int k=1;
    a->massiv_koef=a->massiv_koef+1;
    a->stepen_m=a->stepen_m-1;
    for (int i=0; i<a->stepen_m+1; i++)
    {
        a->massiv_koef[i]=a->massiv_koef[i]*k;
        k++;
    }
    return a;
}
 
// A function doing nothing ;)
void SampleFunction1()
{
    // insert code here
}
 
// A function always returning zero
int SampleFunction2()
{
    // insert code here
 
    return 0;
}
вот header

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef POLINOM_MODULE_H_INCLUDED
#define POLINOM_MODULE_H_INCLUDED
struct polinom;
 
struct polinom
{
    double *massiv_koef;
    int stepen_m;
};
polinom* DeleteLast(polinom* arr);
polinom *SummaPolinomov(polinom *a,polinom *b);
polinom *RaznostPolinomov(polinom *a,polinom *b);
polinom *ProizPolinomov(polinom *a,polinom *b);
double Znach(polinom *a,double x);
polinom * Diff(polinom *a);
 
#endif // POLINOM_MODULE_H_INCLUDED
вот main

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <iostream>
#include "polinom_module.h"
//#include "TXLib.h"
using namespace std;
void vivod(polinom *a)
{
 
 
    for(int i=0; i<a->stepen_m+1; i++)
    {
        cout<<"коэффициент "<<i<<" - "<<a->massiv_koef[i]<<endl;
    }
    cout<<"Cтепень многочлена равна "<<a->stepen_m<<endl;
};
/*void print(double a, double b, double c, polinom *p)
{
    double y1=800/(b-a);
    c=c/y1;
//c=c/1000;
    for(a; a<b; a=a+c)
    {
 
        txLine (a*y1+400, 300-Znach(p,a)*y1, (a+c)*y1+400, 300-Znach(p,a+c)*y1);
    }
 
 
};*/
 
int main()
{
    int j;
    setlocale(LC_ALL, "Russian");
//
// Ввод данных
//
 
//
// Вычисления
//
    polinom *a=new polinom;
    polinom *b=new polinom;
    a->stepen_m=0;
    b->stepen_m=0;
    a->massiv_koef=new double[1];
    b->massiv_koef=new double[1];
    cout<<"введите коэффициенты первого массива"<<endl;
    for (int i=0; i<a->stepen_m+1; i++)
    {
        cin>>a->massiv_koef[i];
    }
    cout<<"введите коэффициенты второго массива"<<endl;
    for (int j=0; j<b->stepen_m+1; j++)
    {
        cin>>b->massiv_koef[j];
    }
    //a->massiv_koef[0]=-3;
    //a->massiv_koef[1]=-1;
    //a->massiv_koef[2]=2;
    //a->massiv_koef[3]=15;
    //b->massiv_koef[0]=12;
    //b->massiv_koef[1]=5;
    //b->massiv_koef[2]=4;
    //b->massiv_koef[3]=-7;
    polinom *c=SummaPolinomov(a,b);
    polinom *d=RaznostPolinomov(a,b);
    polinom *l=ProizPolinomov(a,b);
    polinom *m=Diff(b);
    //cout<<c->massiv_koef[1]<<endl;
    cout<<"Сумма полиномов"<<endl;
    vivod(c);
    
    cout<<"Разность полиномов"<<endl;
    vivod(d);
    cout<<"Произведение полиномов"<<endl;
    vivod(l);
    cout<<"Производная полинома"<<endl;
    vivod(m);
    cout<<"введите точку для определения значения полинома";
    cin>>j;
    cout<<endl;
    cout<<"Значение первого полинома в точке "<<j<<" "<<Znach(a,j)<<endl;
 
    /*cout<<c->stepen_m<<endl;
    cout<<Znach(a,0);*/
    //double first_x;
    //cout<<"СТРОИМ ГРАФИК"<<endl;
    //cout<<"Введите интервал"<<endl;
    //cin>>first_x;
    //vivod(a);
    /*txCreateWindow (800, 600);
    txBegin();
    txTextOut (780, 280, "x");
    txTextOut (380, 20, "y");
    txLine (0, 300, 800, 300);
    txLine (400, 0, 400, 600);
    print(-first_x,first_x,1,a);
    txSleep(1000);
    txSetColor(TX_RED);
    print(-first_x,first_x,1,Diff(a));
    txEnd();*/
    delete[] a->massiv_koef;
    delete[] b->massiv_koef;
    delete[] c->massiv_koef;
    delete[] d->massiv_koef;
    delete[] a;
    delete[] b;
    delete[] c;
    delete[] d;
 
//delete[] l;
    return 0;
}
Добавлено через 21 минуту
скорее всего где-то здесь ошибка((

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
polinom *SummaPolinomov(polinom *a,polinom*b)
{
    polinom *c=new polinom;
    if(a->stepen_m>=b->stepen_m)
    {
        c->massiv_koef=new double[a->stepen_m+1];
        c->stepen_m=a->stepen_m;
        for (int i=0; i<b->stepen_m+1; i++)
        {   cout<<'1'<<endl;
            c->massiv_koef[i]=a->massiv_koef[i]+b->massiv_koef[i];
        }   cout<<'2';
        for(int i=b->stepen_m+1; i<a->stepen_m+1; i++)
        {
            c->massiv_koef[i]=a->massiv_koef[i];
        }
        if (c->massiv_koef[c->stepen_m]==0)
        {
            c->stepen_m=c->stepen_m-1;
        }
 
    }
 
    if (a->stepen_m<b->stepen_m)
    {   cout<<"1";
        c->massiv_koef=new double[b->stepen_m+1];
        c->stepen_m=b->stepen_m;
        for (int i=0; i<a->stepen_m+1; i++)
        {
            c->massiv_koef[i]=a->massiv_koef[i]+b->massiv_koef[i];
            cout<<c->massiv_koef[i]<<endl;
        }
        for(int i=a->stepen_m+1; i<b->stepen_m+1; i++)
        {
            c->massiv_koef[i]=b->massiv_koef[i];
        }
    }
    return c;
}
Yandex
Объявления
05.10.2012, 22:50     Функция, возвращающая указатель на структуру
Ответ Создать тему
Опции темы

Текущее время: 02:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru