-2

if ステートメントでデータを処理していて、そのデータを非ロケール変数として保持したいので、ステートメントの外で呼び出すことができます。これが実際のコードです。注意してください。それはほとんどアイデアの追放にすぎませんが、すべてのアイデアまたはより良い解決策を歓迎します(提案が現在のレベルに対して高度すぎない場合)...

このコードは、多次元の char 配列 (2 次元) を作成し、それを埋めます。後でそれを呼び出そうとすると、割り当てられていない配列値に到達した結果、プログラムがクラッシュします。

       do
       {
        destRow = ( rand() % ROWS ) + 1; // assigning random placement for destroyer ship
        destCol = ( rand() % COLLUMS ) + 1;
        destDir = ( rand() % 2 ) + 1;

        if ( destDir == 1 ) { //Destroyer: 1 = right
            if ( destCol + 1 > COLLUMS ) {
                continue;
            } else {
                char enemyDestroyer[DESTROYER_SIZE][2] = { { board[destCol][0] , board[0][destRow] }, { board[destCol + 1][0] , board[0][destRow] } };
            }

        } else if ( destDir == 2 ) { //Destroyer: 2 = down
            if ( destRow + 1 > ROWS ) {
                continue;
            } else {
                char enemyDestroyer[DESTROYER_SIZE][2] = { { board[destCol][0] , board[0][destRow] }, { board[destCol][0] , board[0][destRow + 1] } };
            }
        }
        destSucces = true;
    } while (!destSucces);

ここでは、割り当てが if ステートメントで発生したため、実際には何も設定されていない、上記で設定されたデータを使用して (他のポイントで収集された) プレーヤーの入力をチェックします。

if ( ( input[0] == enemyDestroyer[0][0] && input[1] == enemyDestroyer[0][1] ) || (input[0] == enemyDestroyer[1][0] && input[1] == enemyDestroyer[1][1] ) ) {
    cout << "Hit!" << endl;
    board[posY][posX] = '!';
    getchar();

    //setting display damage
    if ( input[1] == enemyDestroyer[0][1] ) {
        enmDesDisp[0] = '!';
    } else if ( input[1] == enemyDestroyer[1][1] ) {
        enmDesDisp[1] = '!';
    }
} else {
    cout << endl << "Splash!" << endl;
}
4

1 に答える 1

2

どの配列を参照しているのかは明確ではありません。コード内で操作している唯一の配列は でenemyDestroyer、割り当て後すぐにメモリから解放されます。

おそらく、あなたがしようとしていることをよりよく理解できるように、例を拡張できますか?

アップデート

すぐに解放されないenemyDestroyerようにするには、適切なスコープに移動する必要があります。これは、使用されるのと同じスコープで宣言することを意味します。

スコープについて調べて、おそらくオブジェクト指向設計に切り替えることをお勧めします。

于 2013-07-08T01:52:32.940 に答える