[分割コンパイルの復習]

全文

(1)

[分割コンパイルの復習]

cc -c sample.c (sample.oというオブジェクトファイルを生成)

cc -c sub1.c (sub1.o というオブジェクトファイルを生成)

cc -c sub2.c sub2.o というオブジェクトファイルを生成)

cc -o sample sample.o sub1.o sub2.o (sample.o sub1.o sub2.oの3つをリンク

してsampleという実行ファイルを生成)

上の4行は

cc -o sample sample.c sub1.c sub2.c と同じ.

ヘッダファイルを修正したときには,

それを include しているファイルすべてを再コンパイルする必要がある.

↓ 覚えるのは大変

make の利用 13.Make

Makefileまたはmakefileというファイルに分割コンパイル時のファイルの依存関係と処

理方法を記述.

部分的な変更があった場合,変更が及ぶ範囲だけを処理する.

ファイル include しているヘッダ sample.c config.h inc1.h inc2.h sub1.c config.h inc1.h

sub2.c config.h inc2.h makefile の例

---<ここから>---

#

# 簡単な makefile の例

#

all: sample

sample: sample.o sub1.o sub2.o

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

sample.o: sample.c config.h inc1.h inc2.h cc -c sample.c

トップレベルのターゲット

(2)

[書式]

作りたいファイル:必要なファイル と 依存関係

(TAB)ファイルを作るのに必要なコマンド

上のmakefilesample.c sub1.c sub2.c config.h inc1.h inc2.hと同じディレクトリ におき,

make と入力すると

cc -c sample.c cc -c sub1.c cc -c sub2.c

cc -o sample sample.o sub1.o sub2.o が実行される.

このあと

a) sample.cだけを変更したとき,makeと入力すると cc -c sample.c

cc -o sample sample.o sub1.o sub2.o b) sub1.cだけを変更したとき

cc -c sub1.c

cc -o sample sample.o sub1.o sub2.o c) inc2.hだけを変更したとき

cc -c sample.c cc -c sub2.c

cc -o sample sample.o sub1.o sub2.o d) config.hだけを変更したとき

cc -c sample.c cc -c sub1.c cc -c sub2.c

cc -o sample sample.o sub1.o sub2.o がそれぞれ実行される.

[補足と参考]

sub1.oだけを生成したいときは make sub1.o

と入力すればよい.

• 上のmakefilesample.makeというファイル名で作成したときは make -f sample.make

と入力すればよい.

makefileの中では変数が使用可能.

(3)

(例)

OBJ = sample.o sub1.o sub2.o INC = config.h inc1.h inc2.h LIB = -lm

sample: $(OBJ)

cc -o sample $(OBJ) $(LIB)

sample.o: sample.c $(INC) cc -c sample.c

sub1.o: sub1.c config.h inc1.h cc -c sub1.c

sub2.o: sub2.c config.h inc2.h cc -c sub2.c

makeのより高度な利用法については各自で調べて下さい.

演習問題

12. (ガウスの消去法の後半部分)上三角行列の線形方程式(対角成分は非零とする)

÷÷

÷÷

÷ ø ö çç çç ç è æ

=

÷÷

÷÷

÷ ø ö çç çç ç è æ

÷÷

÷÷

÷ ø ö çç

çç ç è æ

n n

nn n n

b b b

x x x

a a a

a a

a

M M

L

M O O M

L L

2 1 2

1 2 22

1 12

11

0 0

0

の解を求めるプログラムを作成しなさい.また,それを用いて,

÷÷

÷÷

÷ ø ö çç çç ç è æ

=

÷÷

÷÷

÷ ø ö çç çç ç è æ

÷÷

÷÷

÷ ø ö çç

çç ç è æ

1 2 3 5

4 0 0 0

7 3 0 0

9 6 2 0

10 8 5 1

4 3 2 1

x x x x

の解を求めよ.

13. 演習問題 11 で作成した二分法とニュートン法のプログラムを,多項式用に修正せよ.

すなわち,関数を直接プログラムに書くのではなく,次数と係数を入力すればよいよ うに改めよ.(例えば,f(x)=5x3+ x2 4x+2であれば,3,5,1,4,2と入力する.)

(cc -o sample sample.o sub1.o sub2.o –lmと同じ)

(4)

レポート課題

[基本課題](これができなければ不合格)

1. 演習問題12の前段階として,以下の手順を付け加えて線形方程式

÷÷

÷÷

÷ ø ö çç çç ç è æ

=

÷÷

÷÷

÷ ø ö çç çç ç è æ

÷÷

÷÷

÷ ø ö çç

çç ç è æ

n n

nn n

n n

b b b

x x x

a a

a a

a

a a

a

M M

L L

M O M M

L L

2 1 2

1

1

2 22

21

1 12

11

を解くガウスの消去法のプログラムを完成させよ.

手順

1 , , 2 ,

1

= n

k L

n k

k

i= +1, +2,L, n k

k

j = +1, +2,L,

kj kk ik ij

ij a a a a

a = ( / )×

k kk ik i

i b a a b

b = ( / )×

また,これを利用して問題1の解を求めよ.

2. 問題2の7次方程式の実数解(数値解)をすべて求めよ.

[発展課題](できなくてもよい)

3. 課題1では,計算の途中でakk =0となった場合が考慮されていない.そのときはどう 処理すればよいか.処理を施したプログラムを作成せよ.また,問題3の解を求めよ.

4. Newton法には,

収束が早い(二分法などと比較して)

• 必ずしも収束しない(適当な初期点からはじめるといつまでも止まらない)

という特徴があります.これらの特徴が確認できるような問題例を示せ.また,その ときの実行結果を示せ.

なお,問題1〜3は http://www-tamlab.sys.es.osaka-u.ac.jp/~taji/lecture/lecture.html に あります.

締 切

      :11112222月月月21月2121日21日日日((((金金金)12金)12)12)12時時時(時(((期限厳守期限厳守期限厳守期限厳守)))) 提出先:システム事務室

(5)

問題3のファイルデータの説明

このテキストファイルは,まず1行目に行列の次元(方程式の数)が書かれています.

2行目から,1 1 1 の行までは行列Aの要素であり,それぞれの行は i j aij を表しています.そのあとに,右辺のベクトルbの要素が続き,各行は i bi となってい ます.最終行の 1 1 はデータのおわりを示しています.また,要素の値が 0 である ところは,省略しています.

例えば,

÷÷

÷ ø ö çç ç è æ

÷ =

÷÷ ø ö çç

ç è æ

4 0 1

1 4 0

5 2 2

3 0 1

x

という問題例の場合,データは,

3

1 1 1 1 3 3 2 1 −2 2 2 2 2 3 5 3 2 4 3 3 −1

−1 −1 −1 1 1

3 −4

−1 −1 となります.

行列要素のおわりを示す 行列の要素データ(1行2列は省略)

右辺のデータ 3行3列である

データの終わりを示す

Updating...

関連した話題 :