プログラミング演習 II
2003 年 1 1月 19 日(第 6 回)
木村巌
今日やること
複数のファイルから成るプログラム
乗算に備えて、データ型の実装の拡張
構造体、構造体のポインタ、 typedef
復習
前回は、正負の整数の加減算を実装し
た
プログラムの分割
実際に処理を行う main() 関数と、それ に密接に関連した関数群
Mpi の乗除算などを行う関数群 のように、分割した方が便利
変更していない部分をコンパイルし直さな いでよい
プログラムの分割
たとえば、 main() 関数を含む main.c
Mpi 関連の関数は、 mpilib.c などとする Mpi 関連の関数のプロトタイプ宣言、
定数の define などは、ヘッダーファイ
ルにする
コンパイルの仕方
二つのファイルを同時にコンパイル、
リンクして main を得る gcc –o main main.c mpilib.c
それぞれのファイルをコンパイル、そ の後手動でリンクして main を得る
gcc –c main.c gcc –c mpilib.c
gcc –o main main.o mpilib.o
コンパイルの仕方(続き)
main.c
のみ変更した場合は
gcc –c main.c
gcc –o main main.o mpilib.o
のように、
mpilib.cのコンパイルを省い てよい
あるいは、
gcc –o main main.c mpilib.o
でもよい(
main.cのコンパイルとリン
クを同時に)
Main.c
#include <stdio.h>
#include <stdlib.h>
#include “mpilib.h”
/* ダブルクォーテーションはコンパイラのデフォ ルト以外のヘッダファイルを読み込ませる */
Int
main (int ac, char *av[]) {
… }
mpilib.h
#define DIM 4
#define BASE 10 /* prototypes */
Long *mpi_add (long *a, long *b);
などなど
mpilib.c
プログラム本体
#include <stdio.h>
#include <stdlib.h>
#include “mpilib.h”
...
なぜヘッダファイルが必要か
?
変数には、「スコープ」(可視範囲)があっ た
関数についても同様だが、関数名は自動的に 外部へ輸出される
しかし関数のプロトタイプは明示的に宣言しなけ れば行けない
前期( 6 月 11 日の回)の、「変数のスコー プ」を参照
一つのファイル内で宣言された変数名は、そ のファイル内で可視
構造体( structure )
教科書 11 章
異なる型を一つに集約する
配列は、同じ型の値のみ保持できた
構造体の宣言
struct tag 名 {
型名 メンバ 1;
型名 メンバ 2;
…….
};
構造体の例
struct mpi {
int dim;
long *digits;
};
struct mpi a;
構造体のメンバへのアクセス
struct mpi a; /* の時は */
a.dim;
a.digits;
によって、構造体 a の各メンバーにアク
セスできる
型宣言、構造体へのポインタ
教科書 11.2, 11.3
プログラム例 mpistruct.c
レポート課題
Web
に掲示した
mpi3.cを、
main.c ( main() 関数のみを含む)
mpilib.h (プロトタイプ宣言や define を含 む)
mpilib.c (実際の関数定義などを含む)
に分割せよ.ただし、従来の
long *によ る
mpiではなく、今日説明した
mpi_tに 変更すること
コンパイルして、実行した様子も示せ
レポート課題提出要領
2003