UNIXのコンソール上でコマンドを実行する際、コマンド名の後にオプションを付けて実行条件をコマンドに与えることができます。C言語で、その条件を参照するには、main関数の引数が利用できます。
コマンドライン上の文字列は、空白で区切ってみると、複数の単語があることになります。単語数は、main関数の第1引数 argc に入ります。各単語の文字列は、第2引数 argv に格納されています。
#include |
isdigit() 関数を使うと前回の宿題は簡単になりました。man isdigit によりマニュアルを読んでみましょう。欲しかった関数があるかもしれません。
atoi() 関数や sscanf() 関数も知っておくと、文字列の解析が楽になります。
カラー画像を扱うために、1ピクセルを表すデータ構造があれば便利です。
typedef int rgb[3]; int main() { rgb *buffer; buffer = (rgb *)malloc(sizeof(rgb) * sizex * sizey ); buffer[x + y * sizex][0] = 100; // r の輝度値 buffer[x + y * sizex][1] = 200; // g の輝度値 buffer[x + y * sizex][2] = 255; // b の輝度値 } |
分割コンパイルをするために、たくさんのヘッダファイルが作られます。共通して使われるヘッダファイルは、重複してインクルードされることがあります。すると、変数型宣言、関数宣言が重複するため、コンパイル時にエラーとなります。
そこで、#ifndef 〜 #endif、および #define を使うことで回避できます。
#ifndef は、右側で指定された文字列が #define されていないならば、#endif までをコンパイルし、定義されていなければコンパイルしないことを表します。#ifndef の中に #define があるので、2回目のインクルード時には、#ifndef の中の記述はコンパイルされなくなります。
ヘッダファイル imgcats.h の例 #ifndef __IMGCATS_H__ #define __IMGCATS_H__ void imagecat(file *, int ); - - - #endif |
#ifdef というものもあります。これは、右側で指定された文字列が #define されているならば #endif までをコンパイルするこを表します。コンパイルオプションから #define 相当の指定ができるので、プログラムを変更することなしに、デバッグ用コンパイルと本番用コンパイルを切り替えることができます。
int pgmcat(FILE *fp, int num) { - - - - - - #ifdef __TEST__ fprintf(stderr,"x = %d\n", x); fprintf(stderr,"y = %d\n", y); fflush(stderr); #endif - - - } |
上記の例では、gcc -D__TET__ hogehoge.c というコンパイルを行うと、x と y の値を表示しながら実行するプログラムになります。変数の値を覗き見るときに便利です。しかし、本番の実行時には、表示されないほうが嬉しいので、gcc hogehoge.c というコンパイルを行います。すると、#ifdef から #endif まではコンパイルされないので、無駄な表示がされずに済みます。
来週7月21日はアプリケーション発表会です。作成したプログラムをTAの前で実行し、説明してもらいます。作り込んだ機能を存分に紹介してください。
前回と同様に、Web版の採点表と照し合わせてチェックします。そして、ファイルごと提出してもらいます。この時点で、小プログラムの点数はフィックスします。提出できない人は、0 点が確定しますので、注意してください。
2005.7.12 by tokuhisa