「ライブラリ(API)の作り方」の版間の差分
(→ライブラリ(API)を開発するディレクトリの作成方法) |
|||
(2人の利用者による、間の14版が非表示) | |||
行1: | 行1: | ||
− | ここでは、[[オブジェクト指向型ライブラリ]]([[API]])の開発方法を説明します。ここで重要な役割を果たすのは、[[makeobj]]と[[protoObjectMethodCreate]]になります。これらによりある一定の規約に基づいたライブラリが提供されます。 | + | ここでは、[[オブジェクト指向型ライブラリ]]([[API]])の開発方法を説明します。ここで重要な役割を果たすのは、[[makeobj]]と[[protoObjectMethodCreate]]及び、[[protoObjectHeaderCreate]]になります。これらによりある一定の規約に基づいたライブラリが提供されます。 |
== ライブラリ([[API]])を開発するディレクトリの作成方法 == | == ライブラリ([[API]])を開発するディレクトリの作成方法 == | ||
行5: | 行5: | ||
まず、開発を行うディレクトリを作成します。 | まず、開発を行うディレクトリを作成します。 | ||
− | $ | + | $ makeobj ClassName ObjName new |
− | を実行すると、$EOS_HOME/src/Tools/ClassName/ | + | を実行すると、$EOS_HOME/src/Tools/ClassName/ObjName のディレクトリが作られます。<br> |
その下には、src, inc, Config, docのディレクトリができあがります。 | その下には、src, inc, Config, docのディレクトリができあがります。 | ||
<br><br> | <br><br> | ||
+ | |||
+ | == ヘッダファイル、ソースファイルの作成 == | ||
+ | まず、作成したディレクトリ下(incやsrc)で、Cのプロトタイプファイルをつくりたいときは[[protoObjectMethodCreate]]を、ヘッダーファイルをつくりたいときは[[protoObjectHeaderCreate]]を、使用し、ヘッダファイルやソースファイルのプロトタイプを作成します。 | ||
+ | <br><br> | ||
+ | |||
+ | === [[protoObjectHeaderCreate]] === | ||
+ | |||
+ | /* | ||
+ | # test.h : $Revision$ | ||
+ | # $Date$ | ||
+ | # Created by $Author$ | ||
+ | # Usage : test.h | ||
+ | # Attention | ||
+ | # $Loccker$ | ||
+ | # $State$ | ||
+ | # | ||
+ | */ | ||
+ | /* $Log$ */ | ||
+ | #ifndef XXXXX | ||
+ | #define XXXX | ||
+ | |||
+ | #include <stdio.h> | ||
+ | |||
+ | /* constant begin */ | ||
+ | |||
+ | |||
+ | /* constant end */ | ||
+ | |||
+ | /* struct begin */ | ||
+ | |||
+ | |||
+ | /* struct end */ | ||
+ | |||
+ | #ifdef __cplusplus | ||
+ | extern "C" { | ||
+ | #endif | ||
+ | |||
+ | /* prototype begin */ | ||
+ | |||
+ | |||
+ | |||
+ | /* prototype end */ | ||
+ | |||
+ | #ifdef __cplusplus | ||
+ | }; | ||
+ | #endif | ||
+ | |||
+ | #endif /* XXXX */ | ||
+ | |||
+ | === [[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]])のコンパイル== | ||
以下のコマンドでライブラリ([[API]])のソースコードをコンパイルして実行可能なライブラリへ変換します。 | 以下のコマンドでライブラリ([[API]])のソースコードをコンパイルして実行可能なライブラリへ変換します。 | ||
− | $ make check | + | $ cd $EOS_HOME/src/Tools/ClassName/ObjName |
+ | $ make check ; src以下のディレクトリを構築したいとき | ||
+ | $ cd src | ||
$ make depend | $ make depend | ||
$ make clean | $ make clean | ||
$ make | $ make | ||
$ make install | $ make install | ||
+ | $ make install-all ; srcのディレクトリにいて、incの下のインクルードファイルもインストールしたいとき | ||
− | + | なお、これに関連した[[Small Tools]]やライブラリ([[API]])があった場合はそちらも再コンパイルする必要があります。 | |
<br><br> | <br><br> | ||
+ | |||
+ | == ライブラリの実装 == | ||
+ | 実装する際にいくつかの気をつけなければならない点を示します。 | ||
+ | |||
+ | === 関数の基本的な書き方 === | ||
+ | 機能に応じて関数名や引数名は自由に付けることができます。しかし、関数名や引数名を見ただけで概ねの機能や役割が分かるような命名をしておけば、後々他の関数から呼び出す際にも再利用しやすくなります。関数名や引数の付け方に困ったときは、既にコーディングされた他の関数を参考にすることも有効な手段です。以降、既にコーディングされたヘッダやソースファイルを例として関数の書き方や引数の付け方について解説します。 | ||
+ | |||
+ | ==== 引数 ==== | ||
+ | APIで実装する関数の多くは基本的に設定データを元に入力ファイルを処理し、それを出力ファイルへ格納する流れとなっています。特別な場合を除き、入力ファイルを直接書き換えたり、出力ファイルからデータを読み出したりすることはありません。また、このときの設定データはすでにファイルから読み出したデータで構造体として取り扱っています。 | ||
+ | |||
+ | ===== 例1. lmrcImageSingleROI ===== | ||
+ | [[lmrcImageROI2D(API)]]内の関数lmrcImageSingleROIを例としてみます。 | ||
+ | extern void lmrcImageSingleROI(mrcImage* out, mrcImage* in, lmrcImageSingleROIInfo* linfo, int mode); | ||
+ | |||
+ | これは入力画像から切り出して出力画像とする関数で、入力も出力もmrcImageデータです。<br> | ||
+ | 見ての通り引数のうちinが入力で、outが出力となっており、引数の入出力がすぐに判別できます。<br> | ||
+ | <br> | ||
+ | オプションから入力された設定データなどはlinfoのメンバとして下記のように格納されています。<br> | ||
+ | <br> | ||
+ | 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から独立した引数として取り扱っています。 |
2016年10月7日 (金) 00:49時点における最新版
ここでは、オブジェクト指向型ライブラリ(API)の開発方法を説明します。ここで重要な役割を果たすのは、makeobjとprotoObjectMethodCreate及び、protoObjectHeaderCreateになります。これらによりある一定の規約に基づいたライブラリが提供されます。
目次
ライブラリ(API)を開発するディレクトリの作成方法
まず、開発を行うディレクトリを作成します。
$ makeobj ClassName ObjName new
を実行すると、$EOS_HOME/src/Tools/ClassName/ObjName のディレクトリが作られます。
その下には、src, inc, Config, docのディレクトリができあがります。
ヘッダファイル、ソースファイルの作成
まず、作成したディレクトリ下(incやsrc)で、CのプロトタイプファイルをつくりたいときはprotoObjectMethodCreateを、ヘッダーファイルをつくりたいときはprotoObjectHeaderCreateを、使用し、ヘッダファイルやソースファイルのプロトタイプを作成します。
protoObjectHeaderCreate
/* # test.h : $Revision$ # $Date$ # Created by $Author$ # Usage : test.h # Attention # $Loccker$ # $State$ # */ /* $Log$ */ #ifndef XXXXX #define XXXX #include <stdio.h> /* constant begin */ /* constant end */ /* struct begin */ /* struct end */ #ifdef __cplusplus extern "C" { #endif /* prototype begin */ /* prototype end */ #ifdef __cplusplus }; #endif #endif /* XXXX */
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から独立した引数として取り扱っています。