サイズ3×21×21 整数型 の宣言、初期化の式の書き方がわからなく困っています。
教えてもらえると嬉しいです。
3次元配列
Re: 3次元配列
まず、使用したい言語を教えてください。
ちなみに、C言語では厳密には「配列の配列」という型を持つ変数は作れますが、「n次元配列」(n≧2)はという型を持つ変数は作れません。
ちなみに、C言語では厳密には「配列の配列」という型を持つ変数は作れますが、「n次元配列」(n≧2)はという型を持つ変数は作れません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 3次元配列
3 x 21 x 21 は大きいので、3 x 2 x 4 の例を示します。
規格書には「多次元配列」という用語が用いられています。
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. 宣言 は,不完全だが波括弧による囲み方が統一された初期化を含む。これは,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次元
部分集成体を初期化するために使う。いずれかの並びの中に六つを超える要素があ
った場合,診断メッセージが出力されるであろう。同様の初期化は, 又は完全に波括弧で囲まれた形式 によっても達成できる。一般に,完全な括弧付けをした形式,又は最低限の括弧を
使った形式が混乱を生じにくい。
#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. 宣言 は,不完全だが波括弧による囲み方が統一された初期化を含む。これは,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次元
部分集成体を初期化するために使う。いずれかの並びの中に六つを超える要素があ
った場合,診断メッセージが出力されるであろう。同様の初期化は, 又は完全に波括弧で囲まれた形式 によっても達成できる。一般に,完全な括弧付けをした形式,又は最低限の括弧を
使った形式が混乱を生じにくい。