web-dev-qa-db-ja.com

多次元配列の初期化

今日、C++試験で質問を見ました。

配列を指定int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}値は何ですかMulti[1][1][0]

3次元配列は次のように初期化しないでください:{{{},{}},{{},{}},{{},{}}}?どうすればこのようなインデックスを持つ要素の値を見つけることができますか?それはとても混乱しています。

45
user4920379

どちらの方法でも配列を初期化できますが、読みやすさを向上させるため、中括弧を使用することをお勧めします。

中括弧でフォーマットされていない多次元配列の要素の値を見つける最も簡単な方法は、配列を分割することです。たとえば、配列の次元は2x3x2です。

まず配列を2セットに分割します(2 x3x2)

{14,11,13,10,9,6,8,7,1,5,4,2} --> {{14,11,13,10,9,6}, {8,7,1,5,4,2}}

次に、各セットをセットに分割します(2x x2)

{{14,11,13,10,9,6},{8,7,1,5,4,2}} --> {{{14,11}, {13,10} ,{9,6}}, {{8,7}, {1,5}, {4,2}}}

ご覧のとおり、すべての小さなセット(2x3x 2)に2要素が残っているため、配列を中括弧でフォーマットしました。

インデックスが[1][1][0]の要素の値を検索する方が簡単になりました。この要素は、2番目([1] [1] [0])大きいセットの2番目([1] [1] [0])小さいセットの1番目([1 ] [1] [])要素なので、答えは1です。


とはいえ、このような試験問題は、基本的な初期化規則を教えるよりも、プログラミング言語の構文を悪用することに関心がある教師の専門性の欠如を示しています。

63
gdrt

完全なスコアが得られる正しい答えは、すべての警告を有効にしてコードをコンパイルすれば、このようなくだらないコードを作成することにはなりません。

gcc test.c -std=c11 -pedantic-errors -Wall -Wextra
test.c: In function 'main':
test.c:6:3: warning: missing braces around initializer [-Wmissing-braces]
   int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2};
   ^

ただし、先生はコードががらくたであることをそれほど気にしていないのではなく、ブレースリストがの構造と一致しなくても、配列(および構造)を初期化できるようにするC言語の詳細を探していると思います初期化されているもの.

C言語に関する限り、int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}は次のものと完全に同等です。

// properly written initialization list for a 3D array
int Multi[2][3][2] = 
{ 
  {
    {14, 11},
    {13, 10},
    { 9,  6}
  },
  {
    { 8,  7},
    { 1,  5},
    { 4,  2}
  }
};

only最初のフォームが許可される理由は、次のようなものを記述できるためです。

int Multi[2][3][2] = {0};

最初の要素を明示的に0に初期化し、残りの要素は静的ストレージ期間(0も含む)のように初期化します。つまり、すべての要素がゼロに設定されます。

int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}のようなものを書くことは、C言語を乱用しています。それは非常に悪い習慣です。そうすることはMISRA-Cなどによって禁止されています。

優れた教師は、難読化された意味のないコードを解釈させるのではなく、すべてのコンパイラ警告を有効にする方法と多次元配列を適切に初期化する方法を教えることに関心があります。

24
Lundin

int Multi [2] [3] [2] = {14,11,13,10,9,6,8,7,1,5,4,2};

multi [2] [3] [2]のメモリマップは->

マルチ[0] [0] [0] = 14;

マルチ[0] [0] [1] = 11;

マルチ[0] [1] [0] = 13;

マルチ[0] [1] [1] = 10;

マルチ[0] [2] [0] = 9;

マルチ[0] [2] [1] = 6;

マルチ[1] [0] [0] = 8;

マルチ[1] [0] [1] = 7;

マルチ[1] [1] [0] = 1;

マルチ[1] [1] [1] = 5;

マルチ[1] [2] [0] = 42;

マルチ[1] [2] [1] = 2;

したがって、Multi [1] [1] [0] = 1の値。これはとても簡単です

このように初期化することもできます

int Multi [2] [3] [2] = {{{14,11}、{13,10}、{9,6}}、{{8,7}、{1,5}、{4,2 }}};

2