• 検索結果がありません。

第 3 章 TEO プログラミングを始めよう 15

3.5 エラー処理

デバッグモードでプログラムをコンパイルするには,コンパイルオプションに次のオプションを指定します. -DTEO DEBUG1

-DTEO DEBUG2 -DTEO DEBUG3 -DTEO DEBUG ALL

1, 2, 3はデバッグレベルを表します. -DTEO DEBUG ALLオプションは全てのデバッグレベルを有効す

るオプションです. 現在は-DTEO DEBUG3と同じ意味です. -DTEO DEBUG ERROR

オプションを同時に指定すると, 警告を出すところを全てエラーにして停止するようになります.

バグのないクリーンなプログラムを作成するためにも, 始めはデバッグモードを有効にしてプログラムを作 成し,プログラムが完成した後でデバッグモードを解除してコンパイルし直すことをお奨めします.

3.5 エラー処理

本節ではlibteoを使って画像処理プログラムを作成する際のエラー処理について説明します. エラー処理は

必ずしも必要というわけではありませんが,安全なプログラムを作成するためには重要な要素です.

ここでは, リスト3.1に対してエラー処理を追加しながら,どのようなエラー処理が必要になるか説明しま しょう.

ソースはリスト3.4になります. このプログラムでは次の6つのエラーチェックを行っています. 1. プログラムの引数は正しく与えられたか

このプログラムでは引数として入力画像ファイル名と出力画像ファイル名の2つの引数を与えなけ ればいけません. そこで, プログラムの引数の数を表す変数argcを調べて, 引数の数が合わなければ

USAGEを表示して終了します.

2. 入力ファイルを正常に開くことができたか

正常にファイルがオープンできなかった場合,TeoOpenFileはNULLを返します. その時はエラーメッ セージを標準エラーに出力して終了します.

3. 入力画像の画素値の型はTEO UINT8

このプログラムで扱う画素値の型は8ビットの符合なし整数としています. そこで,マクロTeoIsUINT8 を使って入力画像の画素値の型をチェックしています.

4. 出力ファイルを正常に作成できたか

正常にファイルが作成できなかった場合, TeoCreate{Similar}FileはNULLを返します. その時はエ ラーメッセージを標準エラーに出力して終了します.

5. 入力画像データ用のメモリを確保できたか

TeoAlloc{Similar}Imageは正常にメモリが確保できなかった場合, NULLを返します. その時はエラー メッセージを標準エラーに出力して終了します.

6. 出力画像データ用のメモリを確保できたか 4.と同じ.

56行目から始まる画像全体の走査では, TeoXstart, TeoYstart, TeoXend,TeoYendによって画像の範囲を 決定していますので,画素座標(x, y)が画像の範囲外になることはありません. このように, これらのマクロを 使用することで,事前にエラーを回避することができます.

また, libteoの関数実行時にエラーが起きた場合は,以下に示す変数にエラーコード*1とエラーメッセージが

自動的にセットされます.

TEO ERROR CODE

エラー時にエラーコードがセットされます.

TEO ERROR MESSAGE

エラー時にエラーメッセージがセットされます.

ソース内でTEO ERROR MESSAGEを使用する場合には,リスト3.4の4行目のようにexternで宣言し ておかなければいけません. リスト3.4中ではteo関数実行時のエラー表示にTEO ERROR MESSAGEを 使用しています.

エラー表示の確認のためにリスト3.4をコンパイルしcopy2という名前のバイナリファイルを作成し, 入力 画像ファイル名に存在しないファイル名を指定したところ, 次のようなメッセージが表示されプログラムが終 了しました.

% ./copy2 nofile.teo output.teo

Read error! Can’t open file nofile.teo. (error code:1)

リスト3.4画像のコピー(エラー処理の追加)

1 # i n c l u d e <s t d i o . h >

2 # i n c l u d e <t e o . h > / * T E Oラ イ ブ ラ リ 用 の ヘ ッ ダ フ ァ イ ル * /

3

4 e x t e r n c h a r T E O _ E R R O R _ M E S S A G E [ ] ;

5 6 i n t

7 m a i n (i n t a r g c ,

8 c h a r * * a r g v ) {

9 T E O F I L E * s r c _ t e o f p , * d s t _ t e o f p ;

10 T E O I M A G E * s r c _ i m g , * d s t _ i m g ;

11 i n t x , y , p ;

12 T E O _ U I N T 8 v a l ;

13

14 / * 引 数 の チ ェ ッ ク * /

15 i f ( a r g c ! = 3 ) {

16 f p r i n t f ( s t d e r r , " U s a g e : à % s à i n . t e o à o u t . t e o \ n " , a r g v [ 0 ] ) ;

17 e x i t ( 1 ) ;

*1エラーコードはteo.h内で定義されています.エラーコードとそれに対応するエラーの種類を知りたい場合にはteo.hを参照して 下さい. TEO ERROR MESSAGEにセットされたエラーメッセージを見ればどのようなエラーが起きたのかは知ることができ ます.

3.5 エラー処理 23

18 }

19 / * 入 力 画 像 の 読 み 込 み * /

20 s r c _ t e o f p = T e o O p e n F i l e ( a r g v [ 1 ] ) ;

21 i f ( ! s r c _ t e o f p ) {

22 f p r i n t f ( s t d e r r ,

23 " % s à ( e r r o r à c o d e : % d ) \ n " , T E O _ E R R O R _ M E S S A G E , T E O _ E R R O R _ C O D E ) ;

24 g o t o s e t t l e ;

25 }

26 / * 画 素 値 の 型 の チ ェ ッ ク * /

27 i f ( ! T e o I S U I N T 8 ( s r c _ t e o f p ) ) {

28 f p r i n t f ( s t d e r r ,

29 " P i x e l à t y p e à U I N T 8 à i s à o n l y às u p p o r t e d à i n à t h i s à p r o g r a m . \ n " ) ;

30 g o t o s e t t l e l

31 }

32 / * 出 力 画 像 の 生 成 * /

33 d s t _ t e o f p = T e o C r e a t e S i m i l a r F i l e ( a r g v [ 2 ] , s r c _ t e o f p ) ;

34 i f ( ! d s t _ t e o f p ) {

35 f p r i n t f ( s t d e r r ,

36 " % s à ( e r r o r à c o d e : % d ) \ n " , T E O _ E R R O R _ M E S S A G E , T E O _ E R R O R _ C O D E ) ;

37 g o t o s e t t l e ;

38 }

39 / * 画 像 デ ー タ 用 の メ モ リ を 確 保 * /

40 s r c _ i m g = T e o A l l o c S i m i l a r I m a g e ( s r c _ t e o f p ) ;

41 i f ( ! s r c _ i m g ) {

42 f p r i n t f ( s t d e r r ,

43 " % s à ( e r r o r à c o d e : % d ) \ n " , T E O _ E R R O R _ M E S S A G E , T E O _ E R R O R _ C O D E ) ;

44 g o t o s e t t l e ;

45 }

46 d s t _ i m g = T e o A l l o c S i m i l a r I m a g e ( d s t _ t e o f p ) ;

47 i f ( ! d s t _ i m g ) {

48 f p r i n t f ( s t d e r r ,

49 " % s à ( e r r o r à c o d e : % d ) \ n " , T E O _ E R R O R _ M E S S A G E , T E O _ E R R O R _ C O D E ) ;

50 g o t o s e t t l e ;

51 }

52 / * 入 力 画 像 デ ー タ を メ モ リ に 読 み 込 む * /

53 T e o R e a d F r a m e ( s r c _ t e o f p , s r c _ i m g ) ;

54

55 / * 各 画 素 値 を コ ピ ー す る * /

56 f o r ( y = T e o Y s t a r t ( s r c _ i m g ) ; y <= T e o Y e n d ( s r c _ i m g ) ; y + + ) {

57 f o r ( x = T e o Y s t a r t ( s r c _ i m g ) ; x <= T e o Y e n d ( s r c _ i m g ) ; x + + ) {

58 f o r ( p = 0 ; p < T e o P l a n e ( s r c _ i m g ) ; p + + ) {

59 / * 入 力 画 像 の 画 素 値 を 取 得 * /

60 v a l = T e o G e t P i x e l ( s r c _ i m g , x , y , p , T E O _ U I N T 8) ;

61 / * 画 素 値 を 出 力 画 像 デ ー タ に 書 き 込 む * /

62 T e o P u t P i x e l ( d s t _ i m g , x , y , p , T E O _ U I N T 8, v a l ) ;

63 }

64 }

65 }

66 / * 出 力 画 像 デ ー タ を 出 力 フ ァ イ ル に 書 き 出 す * /

67 T e o W r i t e F r a m e ( d s t _ t e o f p , d s t _ i m g ) ;

68

69 s e t t l e :

70 / * 画 像 フ ァ イ ル を ク ロ ー ズ * /

71 i f ( s r c _ t e o f p ) T e o C l o s e F i l e ( s r c _ t e o f p ) ;

72 i f ( d s t _ t e o f p ) T e o C l o s e F i l e ( d s t _ t e o f p ) ;

73

74 / * 画 像 デ ー タ 用 メ モ リ を 解 放 * /

75 i f ( s r c _ i m g ) T e o F r e e I m a g e ( s r c _ i m g ) ;

76 i f ( d s t _ i m g ) T e o F r e e I m a g e ( d s t _ i m g ) ;

77

78 r e t u r n 0 ;

79 }

関連したドキュメント