0

クラスの関数に 2 次元の動的配列を渡す際に問題があります。

void s::LoadData(long int &Num_Of_InputDataId,
                 long int **PresentData,
                 long int **InputDataId,
                 long int **InputData)
{
    long int b;

    for (long int i=0;i<Num_Of_InputDataId;i++)
    {
        b = InputDataId[i][0];
        for(long int j=0;j<Num_Of_InputDataId;j++)
        {  
           InputData[i][j]=PresentData[b][j]; //error occur here
        } // end of internal for
    } //end of external for
}

主要:

long int Num_Of_InputDataId=10;

long int **PresentData;
PresentData = new long int *[Num_Of_InputDataId];

for (long int ii = 0; ii < Num_Of_InputDataId; ++ii)
    PresentData[ii] = new long int[Num_Of_InputDataId];

long int ** InputDataId;
InputDataId = new long int *[Num_Of_InputDataId];

for (long int ii = 0; ii < Num_Of_InputDataId; ++ii)
    InputDataId[ii] = new long int[2];


long int ** InputData;
InputData = new long int *[Num_Of_InputDataId];

for (long int ii = 0; ii < Num_Of_InputDataId; ++ii)
    InputData[ii] = new long int[Num_Of_InputDataId];

Load.LoadData(Num_Of_InputDataId, PresentData, InputDataId, InputData);

Num_Of_InputDataId、PresentData、および InputDataId のそれぞれは、異なる関数から取得されます。

4

3 に答える 3

1

一部iの についてInputDataId[i][0]は、以上ですNum_of_InputDataId

したがって、あなたが呼び出すとき:

b = InputDataId[i][0];
... = PresentData[b][...];

への配列インデックスがPresentData範囲外であるため、メモリ エラーとクラッシュが発生します。

于 2012-06-16T07:48:38.133 に答える
0

あなたは正確なエラーを与えていないので、私は問題について常識的な推測をします. b の値は、Id 配列の要素です。long intこれが であり、コードが (別の配列へのインデックスではなく) ある種の ID コードであることを暗示していることを考えると、その値が他の配列のインデックス範囲を超えている可能性が高く、それPresentDataが原因である可能性があります範囲外のアクセス試行によるメモリ エラー。コード内で b をインデックスであるかのように扱っていますが、そうではない可能性が高いと思われます。

最も簡単な確認方法は、プログラム エラー レポートから推測するのではなく、デバッガーを使用してコードをステップ実行することです (これは、実際の問題を特定するための最初の試みになります)。実際、デバッガーを使用すると、コードをここに貼り付けて質問するよりもおそらく時間がかからないため、デバッグツールをまだ使用していない場合は、終わりのない助けになるので、実際に使用する必要があります.

Superman からのコメントが示唆するように、C++ を使用している場合、STL が提供するすべての優れた機能を利用してベクトルを使用できます。

于 2012-06-16T09:23:51.670 に答える
-1

@Superman があなたの質問にコメントしたように、簡単なスニペットを以下に示します。

#define V(x) std::vector< x>  
typedef V(int)  VI;  
typedef V(VI)  VII; 

void functionDoSomething(VII & arr) {  }

(参照によってベクトルを渡す)。コード内でこのような typedef を使用すると、コードの可読性が向上し、入れ子構造を簡単に定義できます。

于 2012-06-16T11:15:58.590 に答える