C言語を勉強して色々気づいたことの記事で、 C言語の多次元配列の並びが HSP のそれとは逆なのではないか、ということを書きました。それについて、詳しく調べてみました。
このプログラムは、3x3 の二次元配列にメモリの並び順で各要素に連番の数値を代入します。そして、配列の中身を表示します。このプログラムによって、多次元配列の要素がメモリ上でどのように並んでいるかを知ります。
#runtime "hsp3cl"
#const sizeof_int 4
dim array, 3, 3
i = 0
repeat 9
lpoke array, i, cnt
i += sizeof_int
loop
repeat 3
i = cnt
repeat 3
j = cnt
mes "array["+i+"]["+j+"] = " + array( i, j )
loop
loop
#include <stdio.h>
int main( void ) {
int array[3][3];
int *array_p = (int *)array;
for( int i = 0; i < ( sizeof( array ) / sizeof( array[0][0] ) ); i++ ) {
*( array_p ++ ) = i;
}
for( int i = 0; i < 3; i++ ) {
for( int j = 0; j < 3; j++ ) {
printf( "array[%d][%d] = %d\n", i, j, array[i][j] );
}
}
return 0;
}
array[0][0] = 0 array[0][1] = 3 array[0][2] = 6 array[1][0] = 1 array[1][1] = 4 array[1][2] = 7 array[2][0] = 2 array[2][1] = 5 array[2][2] = 8
array[0][0] = 0 array[0][1] = 1 array[0][2] = 2 array[1][0] = 3 array[1][1] = 4 array[1][2] = 5 array[2][0] = 6 array[2][1] = 7 array[2][2] = 8
この結果からメモリ上の並びは次のようになっていることが分かります。
カンマ区切りで、配列の値を一度に複数指定した場合、配列のどの要素に代入されるかを調べます。
dim a, 2, 2
a( 0, 0 ) = 123, 456
a[0][0] に 123 、a[1][0] に 456 が代入されます。
int a[2][2] = { 123, 456 };
a[0][0] に 123 、a[0][1] に 456 が代入されます。
これらは、メモリ上で並ぶように代入されていたというわけです。
二次元配列の場合は、HSP は一次元目が、C言語は二次元目がメモリ上で連続していました。では、三次元以上の場合はどうなるのでしょうか。二次元配列でのプログラムを、三次元のものに編集して実行してみます。ただし、一次元の要素の数を 3 から 2 へ減らしています。
#runtime "hsp3cl"
#const sizeof_int 4
dim array, 2, 2, 2
i = 0
repeat 2 * 2 * 2
lpoke array, i, cnt
i += sizeof_int
loop
repeat 2
i = cnt
repeat 2
j = cnt
repeat 2
k = cnt
mes "array["+i+"]["+j+"]["+k+"] = " + array( i, j, k )
loop
loop
loop
#include <stdio.h>
int main( void ) {
int array[2][2][2];
int *array_p = (int *)array;
for( int i = 0; i < ( sizeof( array ) / sizeof( array[0][0][0] ) ); i++ ) {
*( array_p ++ ) = i;
}
for( int i = 0; i < 2; i++ ) {
for( int j = 0; j < 2; j++ ) {
for( int k = 0; k < 2; k++ ) {
printf( "array[%d][%d][%d] = %d\n", i, j, k, array[i][j][k] );
}
}
}
return 0;
}
array[0][0][0] = 0 array[0][0][1] = 4 array[0][1][0] = 2 array[0][1][1] = 6 array[1][0][0] = 1 array[1][0][1] = 5 array[1][1][0] = 3 array[1][1][1] = 7
array[0][0][0] = 0 array[0][0][1] = 1 array[0][1][0] = 2 array[0][1][1] = 3 array[1][0][0] = 4 array[1][0][1] = 5 array[1][1][0] = 6 array[1][1][1] = 7
説明しづらいですが、感覚としては n次元配列でHSP は「n次元目>...>2次元目>1次元目」ってな感じに並んでいて、C言語は「1次元目>2次元目>...>n次元目」のような感じに並んでいる、という感じです。