2

わかりました、これに関するすべての質問をチェックしましたが、まだわかりません。ループを使用して、文字列配列をファイルに書き込む必要があります。読み取りセクションは正常に動作していますが、これはデバッグ時に特定のものではありません。では、ここで問題です。

それは私に与えます:アクセス違反ですが、正確な行を与えることはできません。私は c++ を初めて使用し、例外処理があまり得意ではありません。EDIT: 変数と配列は上のセクションで宣言されていますが、私はそれらを与えます。

string bord[10][10];
string line;
int i=0,j=1;
ifstream ifile ("test.txt");
//readfile
if (ifile.is_open()){
    getline (ifile,line);
    bord[0][0].assign(line,0,1);
    cout << "i=" << i << " j=" << j<< " inhoud - " << bord[0][0] << endl;
    while (j!=11){
        getline (ifile,line);
        cout << line << endl;
        i=0;
        while (i!=10){
            bord[i][j].assign(line,i,1);
            cout << "i=" << i << " j=" << j<< " inhoud - " << bord[i][j] << endl;
            i++;
        }
        j++;
    }
    ifile.close();
}
ofstream ofile ("test2.txt", ios_base::trunc);
                    //Write File
if (ofile.is_open()){
    if(bord[0][0]=="z"){
        ofile << "zwart";
    }
    else{
        ofile << "wit";
    }
                    //START LOOPING FOR OUTPUT
    for(j=1; j<11; j++){
        ofile << endl;
        for(i=0; i<10; i++){
            cout <<  "i=" << i << " j=" << j<< " inhoud - " << bord[i][j] << endl;
            ofile << bord[i][j];
        }
    }
    ofile.close();
}
4

4 に答える 4

3

外側のforループは ですfor(j=1; j<11; j++)。つまりj、値は 1 から 10 (包括的) になります。ただし、配列は として定義されてstring bord[10][10]いるため、インデックス 0 ~ 9 のみが有効です。

ループを に変更しますfor(j=0; j<10; j++)。0..9 の代わりに 1..10 の値whileも与えるため、同じ方法でループを修正する必要があります。j

于 2011-06-02T11:38:19.867 に答える
2

ボードの寸法が正しくありません。あなた自身のコードによると、それはstring bord[10][11];代わりにすべきですstring bord[10][10];

while (j!=11){'. Note howj`で始まる問題は、このループで最大10になります。つまり、内側の寸法は少なくとも11である必要があります。

于 2011-06-02T11:41:13.193 に答える
0

他の人は、間違ったインデックスを使用してコードが機能しない理由について既に回答しています。C++ は初めてなので、もう少し詳しく説明したいと思います。

C++ の配列は、連続したメモリで表されます。たとえば、次のように文字列の配列を宣言するとstring bord[10]、10 個の文字列オブジェクトに効果的にメモリが割り当てられます。

bord実際には、そのメモリへのポインタです。配列はポインター演算を使用して機能します。つまり、bord[4] を使用する場合bord + 4*sizeof(string)、ポインターが返される前に 4 つの文字列要素があることを意味します。したがって、bord[4]配列の 5 番目の要素を指します。これが、C++ 配列が 0 から始まる理由を説明しています。

のように2次元配列を宣言するstring bord[10][10]と、10個の文字列の配列である10個の要素を持つ配列が割り当てられます。bord[1][0]この場合の意味はそうですbord + 1*(sizeof(string[10]))

配列のサイズよりも大きなインデックスに移動すると、配列に属していない可能性のあるメモリが取得されます (ポインター演算を思い出してください)。それがバッファオーバーフローと呼ばれるものです。

あなたの場合、たとえば参照すると、10文字列の最初の配列の後のメモリは10文字列の別の配列であるためbord[0][10]、実際に値を取得しますが、参照すると、このメモリが属していないため、おそらくアクセス違反が発生します配列に。bord[1][0]bord[10][0]

于 2011-06-02T11:59:09.163 に答える
0

したがって、アクセス違反は、配列の終わりを過ぎているためです.10で定義して配列すると、要素0〜9になります。上記の私のコメントも参照してください。

于 2011-06-02T11:38:27.230 に答える