C言語で数値シミュレーションなどの処理を行う際には,いろいろな数値やファイル名を変えながら,さまざまな場合について処理を実行したいことが多い.
ファイル名や数値などをソースコード中に直接書き込んでしまう方法では,それらを変更した場合に再コンパイルが必要となるため,面倒である.
そこで,これらパラメータをコンパイル時ではなく,実行時に与えることができれば,単一の実行ファイルでさまざまな場合に対応できる.
プログラム中の変数に「実行時に」値を設定する方法は,大きく分けて以下の3通りが考えられる.
| 方法 | メリット | デメリット |
scanf等でキーボードから入力 |
1変数ごとに確認しながら入力できる | 変数の数が多い場合面倒. 入力ミスを招く可能性がある. |
コマンドライン引数でmain関数に渡す |
一括して変数を入力でき,軽快な操作が可. | 条件を変えたときは,全変数を再入力する必要 コマンドプロンプト起動のたびに毎回入力. |
| テキストファイルから読み込み | データを予め用意でき,保存・複製も容易. | エディタで設定ファイル編集の必要あり. ファイル内の構造を事前に決めておく必要がある. |
ソースファイル内の数値を変更してコンパイルすれば,もちろん必要な演算を行うことはできるのは確かである.
しかし,コンパイルしなおすのは時間が掛かるだけでなく,ソースファイルの他の部分をうっかり変更してしまう危険性がある.
一度生成させた実行ファイルを変えることなく,必要な変数の値のみを与える方法が望ましい.
z:¥.windows2000> exeファイル名 値1 値2 ・・・
例えばコマンドライン上で以下のようにタイプしたとする.
z:¥.windows2000> sample.exe 1.52 6.44 9.81
このように,実行ファイル名に続けてスペース区切りで文字列や数値を並べると,
main関数に引数として,1.52,6.44,9.81 が文字列として渡されるため,
プログラム内で適宜利用することができる.数値として利用したい場合は,atoi, atofなどのライブラリ関数を用いて変換すればよい.
具体的な main 関数の引数と戻り値は,以下のとおりである.
int main(int argc, char *argv[])
プログラムの起点となるmain関数も実行が終わると,実行が完了したことをシステムであるOSに伝える必要がある.
画面などに表示されることはないが,main関数の戻り値はOSに返される.
これは「終了コード」と呼ばれるものがあり,一般的に正常であれば 0 が渡される.
したがって,何も処理しない空のmain関数であったとしても,以下のように記す必要がある.
int main(int argc, char *argv[]) /* 引数はvoidでも可 */
{
return 0;
}
厳密には戻り値がvoid型のmain関数は正しくない.
(一部のコンパイラではエラーとならないが,一般的には警告またはエラーとなる場合が多い.)
#include <stdio.h>
int main(int argc,char *argv[])
{
int i;
for(i=0; i<argc; i++) {
printf("argv[%d] : %s\n",i, argv[i]);
}
return 0;
}
実行例:(実行ファイル名をsample.exeとする) > sample.exe 1.52 6.44 9.8 argv[0] : z:\.windows2000\sample.exe argv[1] : 1.52 argv[2] : 6.44 argv[3] : 9.8
注:ここでの表示は「数値」としてではなく,「文字列」として表示されている.
数値として処理を行う場合は,atoi(), atof(), strtol(), strtof()などの変換関数を用いる.