3次元配列

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
prog

3次元配列

#1

投稿記事 by prog » 3年前

コード:

 a[][][] 
サイズ3×21×21 整数型  の宣言、初期化の式の書き方がわからなく困っています。

教えてもらえると嬉しいです。

アバター
みけCAT
記事: 6225
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 3次元配列

#2

投稿記事 by みけCAT » 3年前

まず、使用したい言語を教えてください。

ちなみに、C言語では厳密には「配列の配列」という型を持つ変数は作れますが、「n次元配列」(n≧2)はという型を持つ変数は作れません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

prog

Re: 3次元配列

#3

投稿記事 by prog » 3年前

c言語を使用します。

「配列の配列」という型を持つ変数でもかまいません。

かずま

Re: 3次元配列

#4

投稿記事 by かずま » 3年前

3 x 21 x 21 は大きいので、3 x 2 x 4 の例を示します。

コード:

#include <stdio.h>

int main(void)
{
    int a[3][2][4] = {
        {
            { 9000, 9001, 9002, 9003 },
            { 9010, 9011, 9012, 9013 },
        },
        {
            { 9100, 9101, 9102, 9103 },
            { 9110, 9111, 9112, 9113 },
        },
        {
            { 9200, 9201, 9202, 9203 },
            { 9210, 9211, 9212, 9213 },
        }
    };
    printf("%d\n", a[1][0][2]);
    return 0;
}
規格書には「多次元配列」という用語が用いられています。

X 3010:2003 (ISO/IEC 9899:1999)

6.5.2.1 配列の添字付け
制約 式の一方は,型“オブジェクト型 T型へのポインタ”をもたなければならない。
もう一方の式は,整数型をもたなければならない。結果は,型“T型”をもつ。
意味規則 角括弧[]に囲まれた式を後ろに伴う後置式は,配列オブジェクトの要素
の添字による指定とする。添字演算子[]は,E1[E2]が(*((E1)+(E2)))と等価である
と定義する。2項+演算子に適用する型変換の規則によって,E1 が配列オブジェク
ト(又は,配列オブジェクトの先頭要素へのポインタ)であり,E2が整数である場合,
E1[E2]は E1 の E2 番目(0 から数える。)の要素を指し示す。連続した添字
演算子は,多次元配列の要素を指し示す。E が次元i×j×...×kをもつ n次元配列
(n≧2)である場合,E(左辺値以外として用いた場合。)は,次元j×...×kをもつ
(n-1)次元配列へのポインタに型変換する。単項*演算子をこのポインタに明示
的に適用するか,又は暗黙に添字付けの結果として適用する場合,その結果は,
指されている(n-1)次元配列となり,それ自身を左辺値以外として用いる場合,
ポインタに型変換する。このことから,配列は,行優先の順序(最後の添字が最も速
く変わる。)で格納する。

6.7.5.2 配列宣言子
脚注(121) 幾つかの“Tの配列”の指定を連続的に並べることによって,多次元配列
を宣言できる。

6.7.8 初期化
例6. 宣言

コード:

    short q[4][3][2] = {
       { 1 },{ 2, 3 },{ 4, 5, 6 }
    };
は,不完全だが波括弧による囲み方が統一された初期化を含む。これは,3次元配列
オブジェクトを定義する。q[0][0][0]は 1,q[1][0][0]は 2,q[1][0][1]は 3 となり,
更に 4,5及び 6 は q[2][0][0],q[2][0][1]及び q[2][1][0]をそれぞれ初期化する。
残りはすべて0となる。q[0][0]の初期化子は左波括弧で始まらないので,
現在の並びの中から六つまでの要素を使うことができる。この場合は初期化子が一
つだけなので,残りの五つの要素を 0 で初期化する。同様に q[1][0]及び q[2][0]
の初期化子は左波括弧で始まらないので,各々六つまでの要素をそれぞれの 2次元
部分集成体を初期化するために使う。いずれかの並びの中に六つを超える要素があ
った場合,診断メッセージが出力されるであろう。同様の初期化は,

コード:

    short q[4][3][2] = {
        1, 0, 0, 0, 0, 0,
        2, 3, 0, 0, 0, 0,
        4, 5, 6
    };
又は完全に波括弧で囲まれた形式

コード:

    short q[4][3][2] = {
        {
            { 1 },
        },
        {
            { 2, 3 },
        },
        {
            { 4, 5 },
            { 6 },
        }
    };
によっても達成できる。一般に,完全な括弧付けをした形式,又は最低限の括弧を
使った形式が混乱を生じにくい。

閉鎖

“C言語何でも質問掲示板” へ戻る