[ libohymos | Source | Keywords | Summary | Ancestors | All Members | Descendants ]
Back to the top of Input_file
An object of Class Input_file stores
and has
実際には, 入力ファイル用送信端子モデルは, 要素モデルの一つとしてモデ
ル化されずに, 送信端子モデルの派生モデルとして実現されています。すな
わち, 送信端子モデルにファイル読みとり機能を追加して, 入力ファイル用
送信端子モデルが作成されています。クラス Input_file に関連する派生関
係はつぎのようです。
Object <-- Port <--+
|
+---------------------+
|
+--- Send_port <-- Input_port <-- Input_file <--+-- I_file
クラス Input_file では,
・入力ファイル名 : Object::object_name
・入力ファイルの最終更新時刻 : file_time_at_input
を記憶し,
・入力ファイルからのデータパック送信機能
を定義しました.
Back to the top of Input_file
time_t file_time_at_input;
final update time of the input file
あたらしいデータが取得されたときに、同じ名前の入力ファイルファ
イルに追加書きするか、書き変えられると想定しています。そのた
めに、データを読みこんだときに、ファイルの最終更新時刻を記録
しておき、つぎにファイルを読む必要が生じたときに、ファイルの
最終更新時刻を見て、ファイルが更新されたか検査するようにしま
す。
time_t file_time_at_input;
Back to the top of Input_file
Send_port の純粋仮想関数ですが, Input_file でも純粋仮想関数として
おきます. Input_file の派生クラスで, 送信データパック型を表す文字
列へのポインタを返すように必ず定義して下さい.
例えば, 送信データパック型が "INT" である派生クラスでは,
char* Data_pack_type(void) { return "INT"; }
のように定義します.
接続時, リンク時には, 送信先端子の Data_pack_type と, この端子の
Data_pack_type とが一致することを確認します.
char* Data_pack_type(void) ;
RETURN:
・char* 送信データパック型を表す文字列へのポインタ.
virtual char* Data_pack_type(void) = NULL;
Back to the top of Input_file
1行分文字列データを1個のデータパックに変換する関数を派生クラス
で定義して下さい.
標準的な派生クラスでは, 送信データパック型に応じて次の手続きを定
義して下さい.
純粋仮装関数なので, 派生クラスで必ず定義して下さい.
void* Make_data_pack(char* line_data) ;
(1) 送信用データパックの記憶領域をヒープに生成する.
(2) 文字列 line_data からデータ記録時刻, データ値を読み取る.
(3) (2) で読み取った値を (1) のデータパックのメンバに代入する.
(4) (1) のデータパックのポインタを void* 型にキャストして返す.
ARGUMENT:
・line_data 入力データ1行分の文字列.
RETURN:
・void* 送信データパックへのポインタを void* 型にキャ
ストしたもの.
virtual void* Make_data_pack(char* line_data) = NULL;
Back to the top of Input_file
void Input_data(void);
ここで行頭が '\n', '#' の場合, 空行, コメント行と見なします.
ファイル末尾まで処理が終了したら, Send_port::Send_data_pack_array を用いて data_pack_array を作成します.
ただし, 入力ファイルの最終変更時刻が file_time_at_input 以前の場合 は何もせず return します. コンストラクタで file_time_at_input は LONG_MIN に設定されるので, 初回の入力は必ず実行されます.
EXIT: ・Level 3 入力ファイル object_name をオープンできない場合. ・Level 5 読み取り作業用文字列をヒープに確保できない場合. ACCIDENT: ・データの記述に誤りがある場合. ・関数 Input_file::Make_data_pack の実装に誤りがある場合.
virtual void Input_data(void);
Back to the top of Input_file
void Creq(void) ;
Relay the calculation request to the owner element
void Creq(void) ;
Function is currently defined inline.
Back to the top of Input_file
入力ファイル名とこの端子の送信元受信端子の情報をファイル fp
に出力します.
関数 Cprint はクラス Object の仮想関数なので, 派生クラスごとに変更
できます.
Object::Cprint が多重定義されているため, fp_out を引数に渡さない場
合は stderr に出力され, この時, head も引数に渡さなければ head は
4カラムに設定されます.
void Cprint(FILE* fp_out, char* head);
ARGUMENT:
・fp_out オブジェクト情報を出力するファイルへのポインタ.
引数に渡さない場合 stderr となる.
・head コメント文字列へのポインタ.
fp_out を渡さない場合のデフォルト値は4カラム.
void Cprint(FILE* fp_out, char* head);
Back to the top of Input_file
void Oprint(FILE* fp_out , char* head );
void Oprint(FILE* fp_out = stderr, char* head = " ");
Back to the top of Input_file
引数を f_name, 0 として, Input_port::Init を実行します. 端子
番号は, 0 に設定します.
Boolean Init(char* f_name) ;
RETURN
・YES 初期化が成功した場合
・NO 初期化が成功しなかった場合
ARGUMENT:
・f_name 入力ファイル名.
EXIT:
・5 object_name の記憶領域が確保できない場合.
Boolean Init(char* f_name) ;
Function is currently defined inline.
Back to the top of Input_file
Input_port(char*) は, 基底クラス Input_port のデフォルトコンスト
ラクタを用い, Input_file::Init を用いて, メンバを以下の通り初期化
します.
Input_file(char* f_name);
・class_name : "Input_file"
・object_name : f_name (ヒープにコピー)
・object_number : 0
・owner : NULL
・buffer_list : ヒープに確保する. (接続作業用)
・receiver_array : NULL
・number_of_receivers : -1
・data_pack_array : NULL
・number_of_data_packs : -1
・file_time_at_input : LONG_MIN
Input_file(char* f_name);
Back to the top of Input_file
Input_file(void);
Input_file(void);
Back to the top of Input_file
~Input_file(void);
Destructor
~Input_file(void);
Back to the top of Input_file
Back to the top of Input_file
Back to the top of Input_file
Back to the top of Input_file
Report problems to jkotula@stratasys.com