掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29340

Re:3次元配列の初期化
投稿者---asako(2006/12/27 22:38:46)


例えば、こんな風かしら。

#include <stdio.h>

int array[2][3][4] = {
    { { 1,  2,  3,  4},
      { 5,  6,  7,  8},
      { 9, 10, 11, 12} },
    { {13, 14, 15, 16},
      {17, 18, 19, 20},
      {21, 22, 23, 24} },
};

int main(void)
{
    int i, j, k;
    
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++) {
            for (k = 0; k < 4; k++) {
                printf("%3d", array[i][j][k]);
            }
            printf("\n");
        }
    }
    return 0;
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:3次元配列の初期化 29341 h3X 2006/12/27 22:54:47


No.29341

Re:3次元配列の初期化
投稿者---h3X(2006/12/27 22:54:47)


早速のお返事ありがとうございます。

ご教授下さったコードを当方環境で実行しましたところ、期待通りの出力を得ることができました。


しかし納得できない点がいくつかありますので質問させて頂きます。

1.
「改訂新C言語入門シニア編」のp107で記述されております、最初に示しました初期化の方法は間違っているのでしょうか?

それとも処理系により解釈の結果が異なるのでしょうか?

2.
3次元配列の初期化の方法は asako さんがご教授下さった方法が
標準的な初期化の方法なのでしょうか?


以上2点に関しまして、よろしければご教授よろしくお願い致します。


この投稿にコメントする

削除パスワード

No.29342

Re:3次元配列の初期化
投稿者---asako(2006/12/27 23:09:29)


> それとも処理系により解釈の結果が異なるのでしょうか?

たぶん、そうではないでしょうか。
No.29339のコードをWindowsXP、Borland C++ Compilerで
コンパイルしたところ、以下のエラーや警告が出ました。

警告 W8061 D:\My Programs\C\temp1\temp1.c 4: 初期化の一部だけにカッコがついている
警告 W8061 D:\My Programs\C\temp1\temp1.c 5: 初期化の一部だけにカッコがついている
エラー E2225 D:\My Programs\C\temp1\temp1.c 6: 初期化子が多すぎる
警告 W8061 D:\My Programs\C\temp1\temp1.c 6: 初期化の一部だけにカッコがついている
警告 W8061 D:\My Programs\C\temp1\temp1.c 8: 初期化の一部だけにカッコがついている
警告 W8061 D:\My Programs\C\temp1\temp1.c 9: 初期化の一部だけにカッコがついている
警告 W8061 D:\My Programs\C\temp1\temp1.c 10: 初期化の一部だけにカッコがついている
警告 W8057 D:\My Programs\C\temp1\temp1.c 27: パラメータ 'argc' は一度も使用されない(関数 main )
警告 W8057 D:\My Programs\C\temp1\temp1.c 27: パラメータ 'argv' は一度も使用されない(関数 main )
*** 1 errors in Compile ***

というわけで、実行ファイルが作れませんでした。

> 3次元配列の初期化の方法は asako さんがご教授下さった方法が
> 標準的な初期化の方法なのでしょうか?

標準的かどうかは、あまり知識がないのでよくわかりません。
あんな風にすればできる、ということを知っているだけです。


この投稿にコメントする

削除パスワード

No.29343

Re:3次元配列の初期化
投稿者---h3X(2006/12/27 23:20:02)


>たぶん、そうではないでしょうか。
>No.29339のコードをWindowsXP、Borland C++ Compilerで
>コンパイルしたところ、以下のエラーや警告が出ました。

お試し頂いて感謝致します。
そうですか、やはり処理系によってコードの解釈が異なるようですね。


>標準的かどうかは、あまり知識がないのでよくわかりません。
>あんな風にすればできる、ということを知っているだけです。


ご教授ありがとうございました。

もう少し皆さんの意見もお聞きしたいと思います。


この投稿にコメントする

削除パスワード

No.29345

Re:3次元配列の初期化
投稿者---Geo=TK3(2006/12/27 23:33:57)


>そうですか、やはり処理系によってコードの解釈が異なるようですね。

今回のケースでは一概にそう片付けてしまってはまずいでしょう。
No.29339 で示されているコードは「3 次元配列を 2 次元配列で初期化している」為、意図どおりに初期化されなくても当然ですし。
その結果として 3 次元配列が中途半端に初期化されるか、または実行ファイルを作らないかって処は実装依存になるでしょうけれど、コードの解釈が変わると考えるのはどうかと。



この投稿にコメントする

削除パスワード

No.29346

Re:3次元配列の初期化
投稿者---円零(2006/12/28 17:51:04)


確かに、「解釈」が変わる、というのは何か違う気がしますね。
この場合、要するに
array[0] を {1, 2, 3, 4}で、
array[1] を {5, 6, 7, 8}で初期化し、
array[2] を {9, 10, 11, 12}で初期化しようとしたところで
「初期化子の数多過ぎ」となるのであると考えられます。
つまり、この違いは初期化子の数が多過ぎた場合に
コンパイラエラーとするか、無視してコンパイルした上で警告を発するかの違いであって、
初期化の解釈の違いではないと思います。

なお、規格も読んではみたのですが、初期化子の数が多過ぎる場合に
どう処理したらいいのかは見つけられませんでした。
未定義ってことでいいんでしょうか?



この投稿にコメントする

削除パスワード

No.29347

Re:3次元配列の初期化
投稿者---yoh2(2006/12/28 22:43:42)


ちょいと補足しますと、int [2][3][4]というのは、int [2][3]が4つ並んだ配列
*ではなく*、int [3][4]が2つ並んだ配列なのです。
そのため、

> int array[2][3][4] = {
>    { 1,  2,  3,  4},
>    { 5,  6,  7,  8},
>    { 9, 10, 11, 12},
>
>    {13, 14, 15, 16},
>    {17, 18, 19, 20},
>    {21, 22, 23, 24},
>};

は、最初のint[3][4] (array[0])を{ 1, 2, 3, 4 }で初期化し、2番目のint[3][4]
(array[1])を{ 5, 6, 7, 8 }で初期化しようとします。
でもって、{9, 10, 11, 12}以降はarray[2]以降に対応しますが、array[2]以降が存在
しないため、警告が出たり(gcc)、エラーになったり(bcc32)するわけです。


この投稿にコメントする

削除パスワード

No.29348

Re:3次元配列の初期化
投稿者---asako(2006/12/28 23:06:18)


> ちょいと補足しますと、int [2][3][4]というのは、int [2][3]が4つ並んだ配列
> *ではなく*、int [3][4]が2つ並んだ配列なのです。

あ、なるほど。
だから、No.29340はint型が4つある配列が3つある配列が2つある
(用語が不正確なのは許してください)、という形で
初期化しているのでOKだったんですね。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧