12 11.分割コンパイル
プログラムを作成する際に,ソースコードを複数のファイルに分割して作成する方法.プ ログラムが,sample.c, sub1.c, sub2.c から構成されているものとする.
[コンパイルの方法]
cc -c sample.c cc -c sub1.c cc -c sub2.c
cc -o sample sample.o sub1.o sub2.o
ソース−(コンパイル)→アセンブラコード−(アセンブル)→オブジェクトコード
cc -c
オブジェクトコード1
オブジェクトコード2 −(リンク)→実行ファイル オブジェクトコード3
[利点]
1.開発時のコンパイル時間の短縮
2.汎用的関数やサブルーチンの再利用が可能
3.関数(名)
,変数(名)の通用範囲(スコープ)の制限が可能[どのようなときに使うか]
1.多人数でのプログラム開発(OS
など)2.大規模なプログラム開発
(例)プログラムのあるサブルーチンをいろいろ取り替えて実行してみたい.
一つの処理をいろいろなプログラムの中で利用したい.
(オブジェクトコードを一度作っておけばリンクするだけでよい)
[ヘッダファイルと再コンパイルのお話]
分割してソースファイルを作成する場合,同じ
配列,関数,パラメータ......
がいくつかのファイルで用いられることが多い.このとき
関数や配列のプロトタイプ宣言
パラメータの宣言(定義)
などを,それぞれのソースファイルの先頭で行わなければならない.
しかし,同じ文をそれぞれのソースファイルに書くのは無駄が多い.また,その部分 を修正したい時には,全てのファイルで修正しなければならない(ミスを発生しやす い).そこで,それらをヘッダファイルに置き,必要に応じて include すると便利.
[ヘッダファイルに何を書くか]
・関数,配列のプロトタイプ宣言
・define 文
・大域変数(使い方による)
×プログラム本体は書かない
13
(例) config.h
sample.c sub1.c
12.変数の通用範囲(スコープ)
[プログラムがひとつのファイルからなる場合]
a) { } の中で宣言された変数(自動変数)
{ } の中でのみ領域が確保される
void main(void){
int a;
}
void sub1(void){
int a;
}
{ }
の外でも領域を確保するにはstatic
を付けて宣言する.static int a;
b)
関数({ } )の外で宣言された変数(大域変数)
ファイル全域で領域が確保される.ただし自動変数と重なった場合は自動変数が優 先される.
ひとつのファイルからなる場合
static
を付けても動作に変化はない.{ } の中で extern
を付けて宣言すると大域変数を参照する.[2つ以上のファイルからなる場合]
a)
自動変数については1ファイルの場合と同じb)
他のファイルにある大域変数を参照するにはextern
を付けて宣言する.extern int a;
大域変数に
static
を付けて宣言すると他のファイルから参照できなくなる.static
を関数宣言に付けると他のファイルからその関数を呼べなくなる(名前が重なってもよい).
#define MAX 0 void push(double)
#include <stdio.h>
#include "config.h"
main( ){
/* メ イ ン プログラ ム */
}
#include <stdio.h>
#include "config.h"
sub1( ){
/* サブルーチ ン のプログラ ム */
}
この2つの
a
は無関係14
演習問題9.
下のプログラム例の《 (ア) 》の行を①int a; ② extern int a; ③ 何も書かない
として実行し,それらの結果を比較せよ.また,メインプログラムの
int a; に static
をつけるとどうなるか?一つのプログラムで作成した場合と,2つに分割して作成し た場合で比較せよ.#include <stdio.h>
int a;
void sub1(void);
void main(void){
a=0;
printf("%d¥n",a);
a=2;
printf("%d¥n",a);
sub1();
printf("%d¥n",a);
}
10. a)一実変数の方程式 f ( x ) = 0に対する二分法は, f ( a ) > 0 , f ( b ) < 0
であるような
2点
a, b
を選び,a ≈ b
となるまで,以下の手続きをくり返す.2 / ) ( a b c = +
if f ( c ) > 0 then a = c else if f ( c ) < 0 then b = c
このプログラムを作成せよ.ただし,メインルーチンと関数
f
を計算する部分を別の ファイルに作成すること.b)1実変数関数 f ( x ) = 0の根を求めるのに,Newton 法(Newton-Raphson 法)を
適用すると,その反復は,適当な初期点
x
0からはじめてを繰り返し行う.これを前問と同様に,メインルーチン,
f
およびf ′
を計算する部分 にわけて作成せよ.c)二分法と,ニュートン法を用いて,例えば, cos x − x = 0や3次方程式の解を求め
よ.また,二つの方法の比較をおこないなさい.
演習問題
9
について,A4用紙1枚以内にまとめ,前回のレポートその2とあわせてシステ ム事務室に提出しなさい.〆切は11月6日(水)12時.#include <stdio.h>
void sub1(void){
《 (ア) 》
a=100;
}
) (
) (
1
k k k
k