2016-07-23 13 views
0

関数に1D配列を送るC++プログラムを書いています。関数は配列を操作し、同じ順序の別の配列を返します。 コードは次のとおりです。私はそれをコンパイルするのに問題があります。エラーのトラブルシューティングを手伝ってください。関数との間で行列を渡したり返したりする

#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; 
} 

の#include おかげで、エラーメッセージは、あなたがローカル変数long double retmat[(NN+2)];にアドレスを返却している

[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

です。関数が実行された後は無効になります。あなたはnewでそれのためにメモリを割り当てることによって、この問題を解決することができます

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

または管理メモリとstd::vectorまたはいくつかの他の容器を使用しています。 new[]でメモリを割り当てる場合は、後でdelete[]でメモリを解放する必要があります。

+0

ありがとうございました。私の問題は解決されました。私はコードをコンパイルし、出力は正しいです。 'delete []'に関して、もう少し情報を私に教えてください。私のプログラムは本当に巨大で、私は記憶の問題に直面するかもしれません。 プログラムではどこに 'delete []'を置くべきですか – user3057202

+1

@ user3057202 - 人生のやり方は簡単にすることです。新規/削除の直接使用は避けてください。代わりに 'std :: vector'などを使用してください。あなたを助けるコード/テンプレートがたくさんあります。 –

+1

@ user3057202 - 最も最適な解決策は、newとdeleteの代わりに 'std :: vector'などを使うことですが、それには多くの変更が必要です。 newを使用してdeleteを使用すると、結果の最後の使用サイトの後にdelete []を置く必要があります。これは、投稿しなかった残りのプログラムに完全に依存します。 – 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

関連する問題