前回の復習 引数付き関数 関数:プログラムの一部(命令列)に、名前をつけたもの 「命令列」は「固定」されている (これまで..)プログラムは作成したら、毎回同じ作業しかしない 作業の一部を、あと(プログラムのその部分書いた時の)から決められると便利 => 後で、その部分を変化させる事により、 同じ表現、異なる機能が実現できるから 引数付き関数の効用(よい点 / why ) 一つの記述で、複数の事が実現 v.s 記述のコピーと対比 機能 記述 元に誤りがあった場合 引数付き関数 複数 一つ 修正は一か所 コピーして書き換え 複数 複数 修正が多数 引数付き関数を作るべき 引数は複数指定する事ができる => 課題は、このパターン make と Makefile の話 1. 最悪知らなくてもよい (試験は解ける) 2. しっていると、ものすごく、効率がよくなる => 色々遊びに参加できる make (コマンド) とは (what) Makefile (後述) に記述されている make rule (作成方法) に従って、作業を自動化してくれる !! 作業の時の細かい情報を Makefile に記録すれば、 !! 作業の時に、その「細かい情報」を忘れられる !! => プログラム記述に専念できる [例] ソフトウェア概論の課題 : プログラム作成/コンパイル/実行 編集 : foobar.c を作る コンパイラ : cc -c foobar.c でコンパイルする リンク : cc -o foobar.exe foobar.o でリンク 実行 : ./foobar.exe で実行 => 編集以外の作業を Makefile に記述する事によって、 make だけで、実行できてしまう。 Makefile make が作業を行うためのレシピが記述されている 1) make rule 作品 : 材料で どのように作くるか を記述 foobar.exe : foobar.c cc -c foobar.c cc -o foobar.exe foobar.o foobar.exe を作るには foobar.c を材料に、 料理方法は、 cc -c foobar.c cc -o foobar.exe foobar.o をする。 2) マクロ定義とマクロ参照 [マクロ定義] 「マクロ名=文字列」 で、マクロを定義できる [例] NAME=foobar [マクロ参照] 「${マクロ名}」 で、マクロの値を参照できる [例] ${NAME} マクロを利用すると、 2-1) make rule を「汎用化」できる 2-2) マクロの値を後から設定する事により、 Makefile を転用できる [例] make NAME=p-002 => NAME=p-002 としたのと同じ結果 Makefile を作るときの注意 a) 料理方法の行の頭は[TAB]にする b) 料理方法の行(複数行)の最後は、「空行(改行だけの行)」 c) 保存するときには、拡張子を付けない 名前は Makefile でも makefile でも大丈夫 使い方 a) make : Makefile 通りに作成 b) make マクロ=値 : Makefile のマクロの値を差し替える [課題] 20180511-01-9999.c main 関数があり、関数 sub_20180511_01_9999() を呼ぶ この中には、関数 sub_20180511_01_9999()の定義がない 20180511-01-01-9999.c 関数 sub_20180511_01_9999()の定義がある main 関数はない この二つの .c ファイルは二つで一つのプログラムになる => 個々にコンパイルして (実行ファイルを作る) リンク時にまとめる。 [手順] cc -c 20180511-01-9999.c => 20180511-01-9999.o ができる cc -c 20180511-01-01-9999.c => 20180511-01-01-9999.o ができる cc -o 20180511-01-9999.exe 20180511-01-9999.o 20180511-01-01-9999.o => 実行ファイルを作るには二つのオブジェクト(.o)ファイルが必要 ./20180511-01-9999.exe => 一つまとまったら、実行方法は同じ 一つのプログラムを複数のソース(.c)ファイルに分けて、 それぞれ、コンパイルして、あとからまとめてリンクする方法 => 分割コンパイルと呼ぶ (why) .c を再利用する事が目的 => 詳しくは後日 <= 結果として、作業量が増える => make を利用する Makefile 提出する前に Makefile-20180511-9999.txt に名前を変更して、提出する == [条件分岐] 条件分岐とは、条件(変数の値)によって、異なる命令の どちらか一方を実行する仕組み cf. 順接: 異なる命令を、順に実行する仕組み ! 条件分岐も順接も、命令の組み合わせ方に関する「構文」 [例で説明する]