授業概要(PowerPoint)

プログラミング演習II
2003年11月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年11月25日(火)一杯に、木村まで
メールで送ること.アドレスは
[email protected]
添付ファイルではなく、できるだけメール本
文にレポート本文を記載してください.
文献や友人のレポートを参考にした場合
は、それを明記のこと.
レポートについての注意
資料や他の人のレポートを参考にした場
合は、それを理解すること
間違ったレポートを引き写したとしかいえな
いものが散見されます
自分で考えてもわからず、人のレポートも
十分に理解できないのでは、全く意味がな
い
十分理解できないなら、授業に出席して質
問してください.