2011-06-21 9 views
0

私は10個の配列を扱っていますが、そのうちのいくつかは1024x1392の2倍です。C++/CLIで2D配列のメモリが不足していますか?

私は動的にヒープ上に割り当てるために試してみた:

double **x_array; 

    x_array = new double*[NUM_ROWS]; 
for(int i=0; i < NUM_ROWS; i++) { 
    x_array[i] = new double[NUM_COLS]; 
} 

     for(int ix=0; ix < NUM_COLS; ix++) { 
      for(int iy=0; iy < NUM_ROWS; iy++) { 
       x_array[ix][iy]=(x1y1*(ix+1) + x2y1*(iy+1) + x3y1); 
       //y_array[ix][iy]=(x1y2*(ix+1) + x2y2*(iy+1) + x3y2); 
      } 
     } 
    } 

が、私はまだエラーが

unhandled exception: System.Runtime.InteropServices.SEGException: External Component has thrown an exception. at line 106 

と106私は上記のコードで配列を初期化し始めるところであると言ってます:

x_array = new double*[NUM_ROWS]; 

私は本当にスペースが足りないのですか、何か間違っていますか?

+0

Windows 7、VS 2008、コンパイラについて不明です。 P – Andrw

+0

「sizeof(double)== 8」が114032640バイト、つまり108.75MBになるシステムでは、1024×1392の10個の配列がレコードとして2倍になります。 –

+0

それを得るためにはうまくいったw.r.t. '配列へのポインタの配列'と '配列の配列'です。親切なフレンドリーな 'double **'型が得られるのであなたの方法は良いです。つまり、 'std :: vector'は簡単です。デバッガは何を言っていましたか? –

答えて

2

あなたの配列インデックスが入れ替わっています

for(int ix=0; ix < NUM_COLS; ix++) { 
     for(int iy=0; iy < NUM_ROWS; iy++) { 
      x_array[ix][iy]=(x1y1*(ix+1) + x2y1*(iy+1) + x3y1); 

は次のようになります。

for(int iy=0; iy < NUM_ROWS; iy++) { 
     for(int ix=0; ix < NUM_COLS; ix++) { 
      x_array[iy][ix]=(x1y1*(ix+1) + x2y1*(iy+1) + x3y1); 

またはあなたが実際にいくつかの理由でキャッシュ敵対的なループの順序を維持する必要がある場合:

for(int ix=0; ix < NUM_COLS; ix++) { 
     for(int iy=0; iy < NUM_ROWS; iy++) { 
      x_array[iy][ix]=(x1y1*(ix+1) + x2y1*(iy+1) + x3y1); 
+0

ありがとうございましたが、私はMATLABのコードを使って作業しています(移調されている場所)ので、今は行列操作を簡略化するためにこのようにしています。 – Andrw

+1

@Androo:必要に応じて(キャッシュ敵対的な)ループの順序を保つことはできますが、配列インデックスの順序を修正する必要があります。 C/C++らはすべて行のメジャーです。 iyとixが転置されたため、配列のインデックスが範囲外になります。したがって、クラッシュします。 –

+0

ありがとうございます。私はあなたの提案に従って、それは働いた。私はいくつかの問題に遭遇するかもしれませんが(XとYを切り替えることから)、その行を調整することができますが、それは後で調整することができます。少なくとも、問題の原因はわかります。 – Andrw

関連する問題