ライブラリ(API)の作り方
ここでは、オブジェクト指向型ライブラリ(API)の開発方法を説明します。ここで重要な役割を果たすのは、makeobjとprotoObjectMethodCreate及び、protoObjectHeaderCreateになります。これらによりある一定の規約に基づいたライブラリが提供されます。
目次
ライブラリ(API)を開発するディレクトリの作成方法
まず、開発を行うディレクトリを作成します。
$ maketobj ClassName ObjName new
を実行すると、$EOS_HOME/src/Tools/ClassName/ObjName のディレクトリが作られます。
その下には、src, inc, Config, docのディレクトリができあがります。
ヘッダファイル、ソースファイルの作成
まず、作成したディレクトリ下(incやsrc)で、CのプロトタイプファイルをつくりたいときはprotoObjectMethodCreateを、ヘッダーファイルをつくりたいときはprotoObjectHeaderCreateを、使用し、ヘッダファイルやソースファイルのプロトタイプを作成します。
protoObjectHeaderCreate
protoObjectMethodCreate
/* # %M% %Y% %I% # The latest update : %G% at %U% # #%Z% test ver %I% #%Z% Created by #%Z% #%Z% Usage : test #%Z% Attention #%Z% */ static char __sccs_id[] = "%Z%test ver%I%; Date:%D% %Z%";
元々,EosがSCCSを使って管理されていた名残がここにあります。
ライブラリ(API)のコンパイル
以下のコマンドでライブラリ(API)のソースコードをコンパイルして実行可能なライブラリへ変換します。
$ cd $EOS_HOME/src/Tools/ClassName/ObjName $ make check ; src以下のディレクトリを構築したいとき $ cd src $ make depend $ make clean $ make $ make install $ make install-all ; srcのディレクトリにいて、incの下のインクルードファイルもインストールしたいとき
なお、これに関連したSmall Toolsやライブラリ(API)があった場合はそちらも再コンパイルする必要があります。
ライブラリの実装
実装する際にいくつかの気をつけなければならない点を示します。
関数の基本的な書き方
機能に応じて関数名や引数名は自由に付けることができます。しかし、関数名や引数名を見ただけで概ねの機能や役割が分かるような命名をしておけば、後々他の関数から呼び出す際にも再利用しやすくなります。関数名や引数の付け方に困ったときは、既にコーディングされた他の関数を参考にすることも有効な手段です。以降、既にコーディングされたヘッダやソースファイルを例として関数の書き方や引数の付け方について解説します。
引数
APIで実装する関数の多くは基本的に設定データを元に入力ファイルを処理し、それを出力ファイルへ格納する流れとなっています。特別な場合を除き、入力ファイルを直接書き換えたり、出力ファイルからデータを読み出したりすることはありません。また、このときの設定データはすでにファイルから読み出したデータで構造体として取り扱っています。
例1. lmrcImageSingleROI
lmrcImageROI2D(API)内の関数lmrcImageSingleROIを例としてみます。
extern void lmrcImageSingleROI(mrcImage* out, mrcImage* in, lmrcImageSingleROIInfo* linfo, int mode);
これは入力画像から切り出して出力画像とする関数で、入力も出力もmrcImageデータです。
見ての通り引数のうちinが入力で、outが出力となっており、引数の入出力がすぐに判別できます。
オプションから入力された設定データなどはlinfoのメンバとして下記のように格納されています。
typedef struct lmrcImageSingleROIInfo { char* FileName; lmrcImageROIShape Shape; float centerx; /* For All Shape */ float centery; float blx; /* For Rect, Rect2, Circle */ float bly; -中略- float truePitch; float Ly; float dY; } lmrcImageSingleROIInfo;
最後にmodeという引数がありますが、これは多く場合でコマンドのオプション(-m)の値に相当し、モードによって大きく動作が分かれるので、敢えてlinfoから独立した引数として取り扱っています。