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

Return - C++

Восстановить пароль Регистрация
 
Nolifer
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 5
11.04.2011, 01:51     Return #1
Всем доброго времени суток! У меня возникла проблема с возвратом значения массива double *c, у меня берётся только одно последнее значение c[i]. Прошу объяснить в чём моя ошибка, заранее спасибо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
double POL(double *x,double *y,int n)
{
double *c;
...
    for(i=1;i<=n;i++)
    {
        c[i]=0;
        for(int k=1;k<=n;k++)
        {
            c[i]=c[i]+a[k][i]*y[k-1];
        }
    }
    return *c;
}
int main()
{
...
    for(j=1;j<=N;j++)
    {
        yj[j-1]=POL(xi,yi,m);
    }
...
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2011, 01:51     Return
Посмотрите здесь:

C++ В чем разница между return и return false/true
C++ Return
C++ return
Как сделать так, что если файл существует return true, если нет - return false C++
C++ return (n<0) ? -n:n;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.04.2011, 01:58     Return #2
Не понятно, что вам не нравится... Вы возвращаете *c, т.е. c[0]. А что вы хотели вернуть?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
11.04.2011, 02:02     Return #3
Что это?
Массивы начинаются с нуля.
Память под "с" выделяется? Если нет, эффект непредсказуем.
Возвращается значение double. То бишь значение double, расположенное по указателю "c".
Nolifer
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 5
11.04.2011, 02:04  [ТС]     Return #4
Мне нужно из функции вернуть от с[0] до с[n].
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.04.2011, 02:12     Return #5
Просто вернуть массив не получится. Можно выделять память под массив в функции, возвращать указатель, а очищать память в другом месте. Можно использовать std::vector, его можно вернуть. Можно завернуть массив в структуру и возвращать экземпляр структуры.
Nolifer
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 5
11.04.2011, 02:25  [ТС]     Return #6
Цитата Сообщение от silent_1991 Посмотреть сообщение
Просто вернуть массив не получится. Можно выделять память под массив в функции, возвращать указатель, а очищать память в другом месте. Можно использовать std::vector, его можно вернуть. Можно завернуть массив в структуру и возвращать экземпляр структуры.
Если массив нельзя возвращать, то с моим знанием языка, наверное, легче будет просто массив с[n] считать в главной функции без искользования функции POL.
Fafle
 Аватар для Fafle
34 / 34 / 4
Регистрация: 19.03.2010
Сообщений: 136
11.04.2011, 03:00     Return #7
Как вариант мне кажется конструкция типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
double POL(double *x,double *y,int n, int index)
{
double *c;
...
        for(i=1;i<=n;i++)
        {
                c[i]=0;
                for(int k=1;k<=n;k++)
                {
                        c[i]=c[i]+a[k][i]*y[k-1];
                }
        }
        return c[index];
}
int main()
{
...
        for(j=1;j<=N;j++)
        {
                yj[j-1]=POL(xi,yi,m,j-1);
        }
...
}
Если я правильно понял задачу.
Но тогда при каждом вызове в массиве будут вноситься изменения,был бы более полный код может подсказал бы что...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.04.2011, 03:04     Return #8
Fafle, нет, ТС хотел возвратить массив. Самое смешное, что когда я пишу код - я всё помню, а когда перечисляю варианты, как можно вернуть массив из функции, всегда забываю главный - передача массива через параметр-указатель))) Это, конечно, нельзя назвать чистым возвратом, но основная цель достигнута - массив изменён функцией, и эти изменения видны извне.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.04.2011, 05:58     Return #9
Nolifer, стандартом c++ предусмотрена передача массивов в функцию и возврат из неё только по указателю, а не по значению. Или пиши свой класс массива-объекта, тогда можешь плюнуть на стандарт, так как твой массив не будет стандартным.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2011, 12:33     Return
Еще ссылки по теме:

return *this; C++
C++ return
с++ while return C++

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

Или воспользуйтесь поиском по форуму:
Nolifer
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 5
11.04.2011, 12:33  [ТС]     Return #10
Цитата Сообщение от Fafle Посмотреть сообщение
Как вариант мне кажется конструкция типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
double POL(double *x,double *y,int n, int index)
{
double *c;
...
        for(i=1;i<=n;i++)
        {
                c[i]=0;
                for(int k=1;k<=n;k++)
                {
                        c[i]=c[i]+a[k][i]*y[k-1];
                }
        }
        return c[index];
}
int main()
{
...
        for(j=1;j<=N;j++)
        {
                yj[j-1]=POL(xi,yi,m,j-1);
        }
...
}
Если я правильно понял задачу.
Но тогда при каждом вызове в массиве будут вноситься изменения,был бы более полный код может подсказал бы что...
Вот полный код:
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 "stdafx.h"
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
double POL(double *x,double *y,int n)
{
    double **a,*c,d=0;
    a=new double*[n];
    c=new double[n];
    for(int i=0;i<=n;i++)
    {
        a[i]=new double[n];
    }
    for(int k=1;k<=n;k++)
    {
        a[k][1]=1;
        int i=0;
        for(int m=2;m<=n;m++)
        {
            i++;
            if(i==k)
            {
                i++;
            }
            d=x[k-1]-x[i-1];
            a[k][m]=a[k][m-1]/d;
            for(int j=m-1;j>=2;j--)
            {
                a[k][j]=(a[k][j-1]-a[k][j]*x[i-1])/d;
            }
            a[k][1]=-a[k][1]*x[i-1]/d;
        }
    }
    for(i=1;i<=n;i++)
    {
        c[i]=0;
        for(int k=1;k<=n;k++)
        {
            c[i]=c[i]+a[k][i]*y[k-1];
        }
    }
    return *c;
}
 
int main(int argc, char* argv[])
{
    int n,m,i,j,N;
    double *xi,*xj,*yi,*yj,*yfj,a,b,pog=0;
    cout<<"Vvedite kolichestvo neizvestniv parametrov n:";
    cin>>n;
    cout<<endl;
    cout<<"Vvedite kolichestvo uzlovih tochek m:";
    cin>>m;
    cout<<endl;
    cout<<"Vvedite nachalo intervala a:";
    cin>>a;
    cout<<endl;
    cout<<"Vvedite konec intervala b:";
    cin>>b;
    cout<<endl;
    N=21;
    xi=new double[m];
    xj=new double[N];
    yi=new double[m];
    yj=new double[N];
    yfj=new double[N];
    for(i=1;i<=m;i++)
    {
        xi[i-1]=a+(i-1)*(b-a)/(m-1);
    }
    for(i=1;i<=m;i++)
    {
        yi[i-1]=pow(xi[i-1],1/2.)-cos(xi[i-1])*cos(xi[i-1]);
    }
    for(j=1;j<=N;j++)
    {
        xj[j-1]=a+(j-1)*(b-a)/20;
    }
    for(j=1;j<=N;j++)
    {
        yj[j-1]=POL(xi,yi,m);
    }
    for(j=1;j<=N;j++)
    {
        yfj[j-1]=pow(xj[j-1],1/2.)-cos(xj[j-1])*cos(xj[j-1]);
    }
    for(j=1;j<=N;j++)
    {
        if(fabs(yfj[j-1]-yj[j-1])>pog)
            pog=fabs(yfj[j-1]-yj[j-1]);
    }
    cout<<"Tablica uzlovih tochek:"<<endl;
    for(i=1;i<=m;i++)
    {
        cout<<xi[i-1]<<"     "<<yi[i-1]<<endl;
    }
    cout<<"Tablica vischitannih tochek:"<<endl;
    for(i=1;i<=N;i++)
    {
        cout<<xj[i-1]<<"     "<<yfj[i-1]<<endl;
    }
    cout<<"Tablica vischitannih tochek posle approksimacii:"<<endl;
    for(i=1;i<=N;i++)
    {
        cout<<xj[i-1]<<"     "<<yj[i-1]<<endl;
    }
    cout<<"Pogreshnost'  "<<pog<<endl;
 
return 0;
}
Yandex
Объявления
11.04.2011, 12:33     Return
Ответ Создать тему
Опции темы

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