cc -o sample sample.o sub1.o sub2.o

全文

(1)

11 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

include include include

すると便利.

[ヘッダファイルに何を書くか]

・関数,配列のプロトタイプ宣言

・define 文

・大域変数(使い方による)

×プログラム本体は書かない

(2)

12

(例) 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

は無関係

(3)

13

演習問題

10.

下のプログラム例の《 (ア) 》の行を

①int a; ② extern int a; ③ 何も書かない

として実行し,それらの結果を比較せよ.また,メインプログラムの

int a;

に 

static

  をつけるとどうなるか?  

#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);

}

11. a)一実変数の方程式 f ( x ) = 0

に対する二分法は,

f ( a ) > 0 , f ( b ) < 0

であるような

2点

a, b

を選び,

ab

となるまで,以下の手続きをくり返す.

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 xx = 0

や3次方程式の解を求め

よ.また,二つの方法の比較をおこないなさい.

演習問題

11 c)について, A4

用紙1〜2枚程度にまとめ,システム事務室に提出しなさい.

〆切は

10

26

日(金)12時.

#include <stdio.h>

void sub1(void){

《  (ア)  》 

a=100;

}

) (

) (

1

k k k

k

f x

x x f

x

+

= − ′ ( k = 0 , 1 , 2 ,....)

Updating...

参照

Updating...

関連した話題 :