2016-07-23 2 views
0

Я пишу программу C++, которая отправляет 1D-массив в функцию. Функция управляет массивом и возвращает другой массив того же порядка. Код выглядит следующим образом. У меня возникли проблемы с его компиляцией. Помогите мне устранить ошибки. Благодаря #includeПередача и возврат матрицы к функции

#include <ctime> 
#include<cstdlib> 
using namespace std; 
long double * gradiv(long double *,int,long double); 

int main() 
{ 
    int NN=3,c; 
    long double *pp; 
    long double hx; 
    long double matt[NN+2]={10,9,30,63,50}; 
    pp = gradiv(matt,NN,1.0); 
    for (c=0;c<NN+1;c++) 
     cout<<endl<< *(pp+c)<<endl; 
    return 0; 
} 


long double *gradiv(long double *matt,int NN,long double hx) 
{ 
    int i,sg1,sg2; 
    long double retmat[(NN+2)]; 
    retmat[0]=0;retmat[1]=0;retmat[NN]=0;retmat[NN+1]=0; 
    for (i =2; i <=(NN-1); i++) 
    { 
      if (i==2){ 
       sg1=0; 
       sg2=1; 
       } 
      else if (i==(NN-1)){ 
       sg1=1; 
       sg2=0; 
       } 
      else{ 
       sg1=1; 
       sg2=1; 
       } 
     //===== my main formula for gradient(modified due to complication in the boundary)======== 
      retmat[i]=((*(matt+i)-*(matt+i-1))/hx+(*(matt+i+1)-*(matt+i))/hx)/(sg1+sg2); 
      //cout <<retmat[i]<<endl; 
     //======================================================================================== 
    } 
return retmat; 
} 

сообщение об ошибке

[email protected]:~/Desktop/project$ g++ test.cpp 
test.cpp: In function ‘long double* gradiv(long double*, int, long double)’: 
test.cpp:23:14: warning: address of local variable ‘retmat’ returned [-Wreturn-local-addr] 
    long double retmat[(NN+2)]; 
+0

Для начала 'std :: arrray', возможно, стоит изучить. Также задайте конкретный вопрос, а не что-то неопределенное –

+0

где должен быть добавлен std :: array? Я новичок в C++ Конкретный вопрос: я хочу, чтобы значение массива «retmat» возвращалось функцией всякий раз, когда она вызывается. Но этого не происходит. – user3057202

+0

Пожалуйста, google. Также посмотрите 'std :: vector' –

ответ

0

Вы возвращаете адрес в локальной переменной long double retmat[(NN+2)];. Он становится недействительным после выполнения функции. Вы можете исправить это путем выделения памяти для него с new:

long double* retmat = new long double[(NN+2)]; 

Или использовать std::vector или какой-либо другой контейнер с управляемой памятью. Если вы выделите память new[], вы должны позже ее освободить delete[].

+0

Большое спасибо. Моя проблема решена. Я скомпилировал код, и вывод верен. Что касается 'delete []' вы можете поделиться немного больше информации для меня. Моя программа будет действительно огромной, и я могу столкнуться с проблемой памяти. Где в программе стоит поместить 'delete []' – user3057202

+1

@ user3057202 - трюк в жизни - это сделать его легким. Избегайте прямого использования нового/удаления. Вместо этого используйте 'std :: vector' и т. Д. Существует большое количество кода/шаблонов, которые помогут вам. –

+1

@ user3057202 - Наиболее оптимальным решением является использование 'std :: vector' и т. Д. Вместо нового и удаления, но для этого потребуется много изменений. Используя новые и удаленные, вы должны поместить удаление [] после последнего сайта использования результата и полностью зависит от остальной части вашей программы, которую вы не опубликовали. – SurvivalMachine

0

Я изменил код в соответствии с предложением. Теперь у меня проблема. Программа скомпилирована, но я получаю «ошибку сегментации (ошибка сбрасывания ядра)»

Просьба ознакомиться с моим кодом и найти ошибку.

#include <iostream> 
#include <ctime> 
#include<cstdlib> 
#include<vector> 
using namespace std; 
vector<long double> gradiv(vector<long double> ,int,long double); 

int main() 
{ 
    int NN=3,c,i; 
    vector<long double> pp; 
    long double hx; 
    long double matt[NN+2]={10,9,30,63,50}; 
    vector<long double> matte(matt,matt+NN+2); 
    pp = gradiv(matte,NN,1.0); 
// for (i=0;i<=NN+1;i++) 
    //{ 
    //cout<< pp[i]<<endl; 
    //} 
} 


vector<long double> gradiv(vector<long double> matte,int NN,long double hx) 
{ 
    int i; 
    long double sg1,sg2; 
    vector<long double> retmat; 
    for (i =2; i <=(NN-1); i++) 
     { 
       if (i==2){ 
       sg1=0; 
       sg2=1; 
       } 
      else if (i==(NN-1)){ 
       sg1=1; 
       sg2=0; 
       } 
      else{ 
       sg1=1; 
       sg2=1; 
       } 
      retmat[i]=((matte[i]-matte[i-1])/hx+(matte[i+1]-matte[i])/hx)/(sg1+sg2); 
     } 
return retmat; 
} 
+0

Вы не выделяете какую-либо память для 'retmat' , Исправьте, вызывая 'retmat.resize (NN + 2)' перед циклом. – SurvivalMachine

+0

Вы отправили это как ответ, но вместо этого вы должны были отредактировать эту информацию в исходном вопросе. Это не ответ. – SurvivalMachine

Смежные вопросы