プログラミング演習II 2003年12月10日(第7回) 木村巌
今日やること 構造体、構造体のポインタ、typedef
復習 前回は、正負の整数の加減算を実装した
構造体(structure) 教科書11章 異なる型を一つに集約する 配列は、同じ型の値のみ保持できるのだった
構造体の宣言 struct tag名 { 型名 メンバ1; 型名 メンバ2; ……. };
構造体の例 struct mpi { int dim; long *digits; }; struct mpi a;
構造体のメンバへのアクセス struct mpi a; /* の時は */ a.dim; a.digits;
構造体へのポインタ 任意の型Tに対して、Tへのポインタ型があるのだった 構造体についても、構造体へのポインタが存在する.たとえば、 struct mpi { long dim; long *digits; } *a; /* aはmpiというタグ名の構造体へのポインタ*/
構造体の動的な生成 構造体をプログラムに静的に書き込んでおくのではなく、プログラムの実行中に生成することができる malloc()で必要なサイズのメモリを確保して、目的とする構造体のポインタへキャストする.
構造体の動的な生成(例) mpiへのポインタaは、前のスライドのように宣言されているとする. a = (struct mpi*) malloc (sizeof (struct mpi))); /* 構造体mpiが収まるサイズのメモリを確保 */ (malloc()のエラーチェックは省いている) 構造体のメンバの設定などについては、プログラム例mpistruct.cも参照の事
型宣言、構造体へのポインタ 教科書11.2, 11.3 プログラム例mpistruct.c
型の定義(typedef) C言語の型システムに、新たに型を追加することができる typedefの使い方: 例 typedef long *long_ptr; longへのポインタを、long_ptrという新たな型として追加
構造体のポインタを新たな型とする 上のように定義した構造体mpiを指すポインタを、新たな型として定義する: typedef struct mpi *mpi_t; これで、long, doubleのような組込型同様に、mpi_tも使うことができる. (ただし、mpi_t型の変数は、使う前にメモリを確保し、各メンバーを初期化する必要がある.関数mpi_init()参照)
レポート課題 前回3分割した、 を、従来のlong *によるmpiではなく、今日説明したmpi_tに変更すること main.c (main()関数のみを含む) mpilib.h (プロトタイプ宣言やdefineを含む) mpilib.c (実際の関数定義などを含む) を、従来のlong *によるmpiではなく、今日説明したmpi_tに変更すること コンパイルして、実行した様子も示せ
レポート課題提出要領 2003年12月16日(火)一杯に、木村までメールで送ること.アドレスはiwao@sci.toyama-u.ac.jp 添付ファイルではなく、できるだけメール本文にレポート本文を記載してください. 文献や友人のレポートを参考にした場合は、それを明記のこと.