しかし、結論から言えば、現状の仕様でも問題なくプログラミングできる (Indy の cc コンパイラで動作を確認した)。
出題した仕様において lights という値は
「一列ぶんのデータ」 x 5 の配列の先頭要素へのポインタである。
ただし、誤解を招きやすい仕様だったかも知れない(ごめんなさい)。
納得できない人のために、下のようなサンプルを作ったので検討せよ。
typedef int linedata[5];
void test_func( linedata lights[] )
/* void test_func( int lights[][5] ) */
/* void test_func( int lights[5][5] ) */
/* これら3つの関数の宣言はどれも正しく動作する */
{
int i, x, y;
int *line;
/* 「一列ぶんのデータ」は5個べったり並んでいるので */
/* 25個のフラットな int 配列としてもアクセスできる */
for ( i = 0; i < 25; i++ ) {
printf( "test [%d] =%d\t", i, (*lights)[i] );
printf( "test [%d] =%d\n", i, *(*lights + i) );
}
for ( y = 0; y < 5; y++ ) {
line = lights[y];
for ( x = 0; x < 5; x++ )
printf( "test [%d][%d] =%d\n", y, x, line[x] );
}
}
void main()
{
int lights[5][5] = {
{0,0,0,0,0},
{0,0,0,0,0},
{1,0,1,0,1},
{0,0,0,0,0},
{0,0,0,0,0} };
test_func( lights );
}