3

特定の形式のデータ ファイルから読み取るアプリケーションを作成しています。このファイルでは、ベクター オブジェクトへのポインターの 2D 配列を動的に作成しました。基本的に、ファイル全体を読み取り、特定の文字列パターンを見つけると停止して読み取ります

while(getline(inputFile,tempTestString)){
        // first for ACCEL
        if(string::npos != tempTestString.find(ACCEL)){
            sstream.str(tempTestString);
            sstream >> pushBack;
            cout << "position 1" << endl;
            array[tempDim1][tempDim2].vectorName->push_back(pushBack);
            cout << "position 2" << endl;
            break;
        }
}

現在、pushBack は大きな数であり、最大 20000 になる可能性がありますが、ファイルによって異なります。

このコードの問題は、実行時エラーや例外がスローされないことです。エラーをキャッチしようとしました。プログラムは簡単に終了します。確かに、行と後者の印刷物を追加しましcout << "position1" << endl;cout << "position2" << endl;

あなたが推測していない場合:

tempTestStringおよびACCEL- 文字列オブジェクト

sstream- 文字列ストリーム オブジェクト

array- 動的メモリ内の 2D 構造体配列

vectorName- ベクトル オブジェクトへのポインタ、ポインタが指す構造体のメンバarray

補遺:

したがって、いくつかのコメントに応えて、すべての変数が作成されたコードの他の部分を次に示します。

配列

array = new structName* [tempDim1];
for(int i = 0; i < tempDim2; i++){
    array[i] = new structName [tempDim2];
}

構造体名

struct structName{
    vector<double>* vectorName;
    vector<double>* vectorName1;
    vector<double>* vectorName2;
 };

tempDim1 と tempDim2 は両方ともconst ints、それぞれ値 2 と 3 です。pushBack には最大 20000 の値を指定できます

4

2 に答える 2

3

これを修正してみてください:

array = new structName* [tempDim1];
for(int i = 0; i < tempDim2; i++){
    array[i] = new structName [tempDim2];
}

=>

array = new structName* [tempDim1];
for(int i = 0; i < tempDim1; i++){
    array[i] = new structName [tempDim2];
}
于 2013-02-20T04:00:40.270 に答える
0

初期化で間違った数の要素を使用しています。

array = new structName* [tempDim1];
for(int i = 0; i < tempDim2; i++){
    array[i] = new structName [tempDim2];
}

i < tempDim2間違っている; 配列には tempDim1 要素があります。

これが問題かどうかはわかりませんが、問題です。tempDim1 > tempDim2 の場合、array[] の一部の要素は初期化されません。(逆の場合は、メモリを破損しています。)これが機能する唯一の方法は、tempDim1 と tempDim2 が偶然に同じである場合です。

于 2013-02-20T04:06:36.680 に答える