2012-02-26 11 views
10

はint型アレイは次のように宣言:C++の配列(アルドゥイーノ)

int const A[64] ={ 
    0,0,0,0,0,0,0,0, 
    0,0,0,0,0,0,0,0, 
    0,1,1,1,0,0,0,0, 
    0,1,0,1,0,0,0,0, 
    0,1,1,1,0,0,0,0, 
    0,1,0,1,0,0,0,0, 
    0,1,0,1,0,0,0,0, 
    0,0,0,0,0,0,0,0 
}; 

それから私は、これらへのポインタを持つ別の配列を作成します。そのテキスト配列は、異なるエントリの一定数に達するまで

int const * text[] = { A, B, C }; 

これは、正常に動作します。例えば

これは動作します:

int const * text[] = { A, A, A, A, A, A, A, A }; // could even go on much longer 

が、このクラッシュを:

int const * text[] = { A, B, C, D }; // it seems the number of different entries matters 

理由は何ですか?私はそれがポインタであれば、それは常にそれが一定のサイズであることを指しているかどうかは関係ありませんと思った?

これは非常に限られたメモリを持つarduinoプラットフォーム上で実行されることに注意してください。

+0

発生するクラッシュの詳細な説明を追加できますか? –

+0

申し訳ありませんが、プラットフォームはエラーを表示しません。プログラムは実行されるか実行されません。 – clamp

+0

配列は 'text'の初期化以外で参照されていますか? –

答えて

2

同じ要素を持つ配列の検索が最適化されていると思われます。 int const *text[];がヘッダーファイルで宣言され、別のオブジェクトファイルでコンパイル(定義)された場合、同じ問題が発生する可能性があります。リンカは可能な限り最善を尽くしていますが、そのデータはすべてヒープ/スタック領域と重複している可能性があります。

少なくともavr-libc(avr-gcc、avr-binutilsを使用)では、このような定数データをより大きな読み込み専用プログラム空間(フラッシュROM )。

+0

コンパイラ/リンカが未使用の文字を最適化していることを意味していますか? – clamp

+1

@clamp - そのシンボルが決して参照されない場合はyesです。ルックアップが 'A'を返すことをコンパイラが知っている場合、コンパイル時にその定数を折り畳みます。実際のルックアップを実行する必要はありません。 –