2009-03-12 48 views
0

大きな4D行列を割り当てようとしていますが、私は動的にそれをやりたいのです。静的な行列を作成するだけで、すべてが正常に動作するので、今は十分なメモリがあることがわかります。しかし、同じことを動的に実装しようとすると、3次元に入るたびに壊れてしまい、4番目にする必要があります。誰でもこのコードがうまくいかない理由を教えてもらえますか?4Dアレイを割り当てるときにセグメンテーションフォルト(コアダンプ)が発生するのはなぜですか?

#include <iostream> 

using namespace std; 

static const int time1 = 7; 
static const int tlat = 15; 
static const int tlon = 17; 
static const int outlev = 3; 

int main(void) 
{ 
    //allocate four dimensional dataIn 
    int ****dataIn; 
    dataIn = new int ***[time1]; 
    if (dataIn == NULL) { return 1; } 

    for(int i = 0 ; i < time1 ; i++) { 
     dataIn[i] = new int **[tlat]; 
     if (dataIn[i] == NULL) { return 1; } 

     for(int j = 0 ; j < tlat ; j++) { 
      dataIn[i][j] = new int *[tlon]; 
      if (dataIn[i][j] == NULL) { return 1; } 

      for(int k = 0 ; k < tlon ; k++) { 
       dataIn[i][j][k] = new int[outlev]; 
       if (dataIn[i][j][k] == NULL) { return 1; } 
      } 
     } 
    } 
    //there is more code that happens here to add values to dataIn 
    //and eventually output it but I know all of that works   
    return 0; 
} 

このコードではさまざまなバリエーションを試していますが、新しいものではなくmallocを使用しましたが、動作させることはできません。どんな助けでも大歓迎です。

+0

ここではクラッシュしません。実際の*コードブロックが役立つかもしれません。 – dirkgently

+0

投稿したコードをコンパイルしましたが、VS2005でクラッシュすることなく実行されました。あなたの問題がより具体的であるようにしてください。 –

+0

以下のコメントでは、エラーが 'dataIn [i] [j] ='の行にあることを示します。 iとjの値は?返されるポインタの値はどれくらいですか?デバッガ(grokには難しい)がない場合は、状態を示すprintステートメントを置くことで古い方法で行うことができます。 –

答えて

2

これをデバッガで実行しましたか?私の目にはコードはうまく見えますが、デバッガがどこでクラッシュしているのかを教えてくれるので、それだけでは解決できません。

+0

コードは正常にコンパイルされますが、私のコンパイラ以外にはデバッガがありません。非常に多くのことを試してみることで、私自身のデバッグのために、私はdataIn [i] [j]を割り当てようとしている行が壊れていることを知っています。何らかの理由でポインタがおそらく悪いですが、それを修正する理由や修正方法がわかりません。 –

+0

エラー、デバッガがないなどのプラットフォームはありますか? – olliej

+0

デバッガはあなたの人生を変えるでしょう – tarn

2

フラットな配列にすべてのメモリを割り当ててから、あなた自身。カプセル化のためのオブジェクトにすべてのものをラップします。

class Matrix { 
private: 
     int* data;   
     int[] sizes; 
     int nDimensions; 

public: 
     // allocates the data pointer and copies the other parameters 
     Matrix(int[] sizes, int nDimensions); 

     // frees the data and sizes arrays 
     ~Matrix(); 

     // calculates the cell position and returns it 
     int getCell(int[] coordinates); 

     // calcultes the cell position and sets its value 
     void setCell(int[] coordinates, int value); 

private: 
     // used by getCell and setCell, calculates the cell's 
     // location in the data array 
     size_t calculateCellPosition(int[] coordinates); 
}; 
+0

このアプローチは、より速くなるという利点も提供します。すべての状況でコードが高速である必要があるわけではありませんが、それでもやっかいな習慣です。 – Thomas

1

Linuxマシンでコンパイルされて正常に動作します。

標準のC++の場合、newはメモリを割り当てることができないときにNULLを返す代わりにstd :: bad_alloc例外をスローします。したがって、NULLポインタをテストする代わりにその例外を捕捉する価値があるかもしれません。

0

cmeerwによって指摘されているように、NULLまたは0に対するテストはstd-​​C++では必要ありません。

segvを取得した正確な場所にコメントを追加すると便利です。

参考:どのコンパイラを使用していますか、どのOSで使用していますか?

0

boost::multiarrayをチェックしてください。ヒープ割り当てを1つだけ行うだけで効率的です

関連する問題