プログラミング演習I

プログラミング演習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
mpi))); /* 構造体mpiが収まるサイズのメ
モリを確保 */
(malloc()のエラーチェックは省いている)
構造体のメンバの設定などについては、プ
ログラム例mpistruct.cも参照の事
型宣言、構造体へのポインタ
教科書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日(火)一杯に、木村まで
メールで送ること.アドレスは
[email protected]
添付ファイルではなく、できるだけメール本
文にレポート本文を記載してください.
文献や友人のレポートを参考にした場合
は、それを明記のこと.