• 検索結果がありません。

.分割コンパイル

N/A
N/A
Protected

Academic year: 2021

シェア ".分割コンパイル"

Copied!
3
0
0

読み込み中.... (全文を見る)

全文

(1)

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 文

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

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

(2)

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

は無関係

(3)

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

を選び,

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次方程式の解を求め

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

演習問題

9

について,A4用紙1枚以内にまとめ,前回のレポートその2とあわせてシステ ム事務室に提出しなさい.〆切は11月6日(水)12時.

#include <stdio.h> 

 

void sub1(void){ 

《  (ア)  》 

    a=100; 

) (

) (

1

k k k

k

f x

x x f

x

+

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

参照

関連したドキュメント

(The Elliott-Halberstam conjecture does allow one to take B = 2 in (1.39), and therefore leads to small improve- ments in Huxley’s results, which for r ≥ 2 are weaker than the result

“Breuil-M´ezard conjecture and modularity lifting for potentially semistable deformations after

S., Oxford Advanced Learner's Dictionary of Current English, Oxford University Press, Oxford

At the end of the section, we will be in the position to present the main result of this work: a representation of the inverse of T under certain conditions on the H¨older

ある周波数帯域を時間軸方向で複数に分割し,各時分割された周波数帯域をタイムスロット

また、同法第 13 条第 2 項の規定に基づく、本計画は、 「北区一般廃棄物処理基本計画 2020」や「北区食育推進計画」、

○○でございます。私どもはもともと工場協会という形で活動していたのですけれども、要

3R ※7 の中でも特にごみ減量の効果が高い2R(リデュース、リユース)の推進へ施策 の重点化を行った結果、北区の区民1人1日あたりのごみ排出量