プログラミング応用1 第11回
解説
#define: 定数の定義、
typedef: 型の俗称をつけるー>移植性○ 使い方) typedef 既存の型 新しくつける型名
演習
(1)上記プログラムをe70201.cというファイル名でセーブし、コンパイル後実行せよ。
void usage()
{
printf("引数が間違っています\n");
printf("e70202 始め 終わり\n");
exit(1);
}
解説
コンパイラが出力するエラーメッセージには、エラーがあった箇所の行番号が
示されている。その行やその前後(特に直前)を見れば、多くの間違いは発見できる。
例えば==を=とした時のように、文法的に間違えがなければコンパイル時にエラーとならない。
emacs:M-x goto-lineで指定した行番号にカーソルを移動
リンカ(ld)の出力したエラーメッセージの例(printfをprnitfと間違えた)
ld: Undefined symbol
_prnitf
リンク時に、他のファイルやライブラリ中に指定の関数がないことが判明する。
例えば、関数名/外部変数名の間違え、必要なライブラリ名の未指定
1)Segmentation fault
許されていない範囲のメモリ番地をプログラムが読み書きしようとした。
ポインタの取り扱いの誤りなどによって起こる。
2)Bus error
アクセスしたメモリ番地が語の境界と一致していない。
3)DOMAIN error
定義域外の値で計算を行なう。例えば、sqrtに負の数を与えたとき。
異常終了時や、無限ループに入ったときには、誤動作の原因となっている箇所を
正しく把握する必要がある。
1)printf文,getchar文などで正しく動作している部分を順次追っかけていき、間違っている箇所を見つける。
2)デバッガと呼ばれるプログラムを用いて、効率的に作業する。
デバッガにはdbxやgdbなどのプログラムがあるが、使い方は各自で調査する。
演習
(1)上記プログラムをe70202.cというファイル名でセーブし、コンパイル後実行せよ。
(2)e70202.cは何箇所か間違っている。上記説明を読み、デバックせよ。
本プログラムは、入力した2つの数の間の整数和を求めるプログラムである。
例えば、2と5を入力すれば、2+3+4+5を演算する。
enzanという関数では、1からnまでの和を再帰法にて演算させたい。
解説
fscanf(in,"%s\n%d %d\n%d\n",type,&width,&height,&depth);
TYPEは白黒画像がP5、カラー画像がP6である。
lessでヘッダ情報を確認してみよう。
演習
(1)標準白黒画像を各自のホーム下のpro17ディレクトリの中にgirl.pgmという名前でセーブせよ。
標準画像 girl.pgm
(2)less girl.pgmでヘッダ情報を確認する。
(3)上記プログラムをe70203.cというファイル名でセーブし、コンパイル後実行せよ。
(4)実行ファイル名 入力pgmファイル名 出力pgmファイル名
ex. e70203 girl.pgm out.pgm
(5)magic(あるいはxv)でgirl.pgmやout.pgmを確認する。
magic girl.pgm, magic out.pgm
上下の反転画像
(6)左右反転させた画像out2.pgmを作成せよ。
左右の反転画像
(7)90度回転させた画像out3.pgmを作成せよ。
90度回転画像
本日の課題
(1)プログラム例(26)で誤りを修正したプログラムをk70201.cとして提出せよ。
余裕のある人のみ
(2)プログラム例(31)を基に、原画像の大きさを縦半分、横半分にした画像を作成するプログラムk70202.cを提出せよ。
切り出すのではなく、画面全体を縮小する。