プログラミング演習II 2003年11月19日(第6回) 木村巌
今日やること 複数のファイルから成るプログラム 乗算に備えて、データ型の実装の拡張 構造体、構造体のポインタ、typedef
復習 前回は、正負の整数の加減算を実装した
プログラムの分割 実際に処理を行うmain()関数と、それに密接に関連した関数群 Mpiの乗除算などを行う関数群 のように、分割した方が便利 変更していない部分をコンパイルし直さないでよい
プログラムの分割 たとえば、main()関数を含むmain.c Mpi関連の関数は、mpilib.cなどとする Mpi関連の関数のプロトタイプ宣言、定数のdefineなどは、ヘッダーファイルにする
コンパイルの仕方 二つのファイルを同時にコンパイル、リンクしてmainを得る gcc –o main main.c mpilib.c 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;
型宣言、構造体へのポインタ 教科書11.2, 11.3 プログラム例mpistruct.c
レポート課題 Webに掲示したmpi3.cを、 main.c (main()関数のみを含む) mpilib.h (プロトタイプ宣言やdefineを含む) mpilib.c (実際の関数定義などを含む) に分割せよ.ただし、従来のlong *によるmpiではなく、今日説明したmpi_tに変更すること コンパイルして、実行した様子も示せ
レポート課題提出要領 2003年11月25日(火)一杯に、木村までメールで送ること.アドレスはiwao@sci.toyama-u.ac.jp 添付ファイルではなく、できるだけメール本文にレポート本文を記載してください. 文献や友人のレポートを参考にした場合は、それを明記のこと.
レポートについての注意 資料や他の人のレポートを参考にした場合は、それを理解すること 間違ったレポートを引き写したとしかいえないものが散見されます 自分で考えてもわからず、人のレポートも十分に理解できないのでは、全く意味がない 十分理解できないなら、授業に出席して質問してください.