2017-01-31 10 views
1

これは優雅ではないかもしれません。主に私はC++に比較的新しいので、私がまとめているこの小さなプログラムはここではうんざりしています。C++では、多次元配列の要素の増加が別の要素を増やしているように見えるのはなぜですか?

私はそれを取得しません。私は配列を誤解しましたか?編集されたコード:

int diceArray [6][3][1] = {}; 

... 

}else if (y >= xSuccess || x >= xSuccess){ 

// from here... 

    diceArray[2][1][0] = diceArray[2][1][0] + 1; 
    diceArray[2][1][1] = diceArray[2][1][1] + 1; 

// ...to here, diceArray[2][2][0] increases by 1. I am not referencing that part of the array at all. Or am I? 

} 

コメントを使用して、私は第2の表現に犯人を追跡しました。私が最初の1つをコメントアウトすると、diceArray[2][2][0]は変更されません。

なぜdiceArray[2][1][1] = diceArray[2][1][1] + 1diceArray[2][2][0]を増やすのですか?

私が試した..

c = diceArray[2][1][1] + 1; 

diceArray[2][1][1] = c; 

は、回避策を..asが、それはちょうど同じでした。それはdiceArray[2][2][0]を1つ増やした。

+2

'もし'あなたに 'else'を使っていますか? add code – Raindrop7

+0

'diceArray [6] [3] [1]'は、配列の3番目のインデックスに1つの要素しかないことを意味します。 'diceArray [2] [1] [1]'は索引から2番目の要素にアクセスしています。 – Gabriel

+0

'diceArray'の第3次元は' 1'です。あなたのコードでは、値0と1を使用して3次元の値をインデックスします。それはあまりにも遠すぎます。 – Peter

答えて

11

範囲外のインデックスを作成しています。私は、このような配列

int data [3]; 

を宣言する場合は、有効なインデックスが

data[0] 
data[1] 
data[2] 

あり、このアナログは、あなたが

int diceArray [6][3][1] 
        ^

を宣言しかし、その後

diceArray[2][1][0] 
       ^

diceArray[2][1][1]  // This is out of range 
       ^
に割り当てようとするということです

変数は次のように宣言されている

+0

ああ!さて、配列のサイズを大きくするだけです。おそらく私のVB6日から何らかの種類のものを保持しています。私は今すぐそれを試みます。 –

+0

もちろん、もちろん動作します。どうもありがとうございました! –

+4

@DJones:答えを受け入れる – Raindrop7

0

範囲外、等により、あなたが実際に起因するストライドに次の次元に割り当てるポインタ演算に:

int diceArray [6][3][1] = {}; 

これは、メモリ内にどのように見えるかです:

+---+      -. 
| | <- diceArray[0][0]  \ 
+---+       \ 
| | <- diceArray[0][1]  > diceArray[0] 
+---+      /
| | <- diceArray[0][2] /
+---+      -' 
| | <- diceArray[1][0]  \ 
+---+       \ 
| | <- diceArray[1][1]  > diceArray[1] 
+---+      /
| | <- diceArray[1][2] /
+---+      -' 
    .   .      . 
    .   .      . 
    .   .      . 
+---+      -. 
| | <- diceArray[5][0]  \ 
+---+       \ 
| | <- diceArray[5][1]  > diceArray[5] 
+---+      /
| | <- diceArray[5][2] /
+---+      -' 

diceArrayの最も内側の構成要素は、サイズ1の配列です。 C/C++配列は常に0からインデックスされ、有効なインデックスと配列のサイズは1で、唯一の有効インデックスは0です。コンパイル時

は、diceArray[x][y][z]への参照をベースとしてdiceArrayのメモリアドレスを使用してx*3*1+y*1+zint値)をオフセットするためにポインタ演算を使用して変換されます。

コード:

diceArray[2][1][1] = diceArray[2][1][1] + 1; 

diceArray内部8 (=2*3*1+1*1+1)オフセットで動作します。同じオフセットは、diceArray[2][2][0]を使用して計算されます。これは、配列内の正当なアクセスです。

現代のコンパイラは、通常この種のエラーを検出し、コンパイル時に警告します。

関連する問題