C言語では、2次元配列が扱いにくい。理由は、横幅の指定をプログラム中に組み込まなければならないので、自由度が低いからである。そこで、2次元配列を扱う構造体を定義しよう。
2次元配列の構造体 Array2dInt は、int を2次元配列として扱うために、int のデータ領域 buff、横サイズ int width、縦サイズ int height で構成する。この構造体のソースファイル名を array2dint.h とせよ。
Array2dInt の操作をするサブルーチン一式を、array2dint.c というソースファイルに作成せよ。以下のサブルーチンを含めることとせよ。
array2dint.h、array2dint.c、prac0201.c を用いて、下記のコンパイルト実行のできることを確認せよ。なお、prac0201.c はリンク先のものを使用し、Makefile は自分で作成せよ。
> make prac0201 gcc -Wall -O3 -c array2dint.c gcc -Wall -O3 -o prac0201 prac0201.c array2dint.o >
./prac0201 を実行し、キーボードから、x 位置、y 位置、値 を入力している。
> ./prac0201 3 4 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >
array2dint.h と array2dint.c の雛形
/* array2dint.h */ #include 「FILE *を使うために…」 typedef struct { 「int のポインタ」 「横サイズと縦サイズ」 } 「データ構造名」 Array2dInt *array2dint_open(???); void array2dint_close(Array2dInt *); ??? array2dint_ref(Array2dInt *, int, int); ??? array2dint_set(Array2dInt *, int, int, int); void array2dint_print(Array2dInt *, FILE *); |
/* array2dint.c */ #include 「NULLや FILE* を使うために…」 #include 「malloc や free を使うために…」 #include 「構造体 Array2dInt を使うために…」 ??? *array2dint_open( ??? ) { 「Array2dInt を malloc」 「malloc できなければ、エラー終了」 「縦と横のサイズを考えて、int の領域を malloc」 「malloc できなければ、エラー終了」 「メンバ変数への代入 (デフォルト値での初期化を忘れずに)」 return ??? } ??? array2dint_close( ??? ) { 「buff の領域を開放する」 「自身の領域を開放する」 } ??? array2dint_ref( ??? ) { return ???->???[??? * ??? + ???]; } ??? array2dint_set( ??? ) { ???->???[??? * ??? + ???] = ??; } void array2dint_print(Array2dInt *a, FILE *fout) { int i, j; for( j = 0; j < a->height; j += 1 ){ for( i = 0; i < a->width; i += 1 ) fprintf(fout," %d", array2dint_ref(a, i, j)); fprintf(fout,"\n"); } } |
次回の演習開始時に集めます。