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