|
|
Frstrindex、Frstrindex32(3fml)
名前
Frstrindex()、Frstrindex32() - バッファにあるインデックスをリストアする
形式
#include <stdio.h>
#include "fml.h"
int
Frstrindex(FBFR *fbfr, FLDOCC numidx)
#include "fml32.h"
int
Frstrindex32(FBFR32 *fbfr, FLDOCC32 numidx)
機能説明
インデックス解除されたフィールド化バッファは、Findex() または Frstrindx() を呼び出して再インデックスされます。fbfr は、フィールド化バッファを指すポインタです。Findex() は、バッファにおけるすべてのインデックスの計算を行い、かなり効率は悪くなります (バッファをすべて走査することが必要になる)。この関数は、インデックスされていないバッファが変更された場合、あるいはバッファの前の状態がわからない (たとえば、バッファがあるプロセスから他のプロセスへインデックスなしで送られた場合) ときに使用する必要があります。Frstrindex() は、非常に高速ですが、バッファが、前のインデックス解除操作以降、変更されていない場合のみ使用されます。Frstrindx() の 2 番目の引数 numidx は、Funindex() 関数の戻り値です。
Frstrindex32() は 32 ビット FML で使用されます。
マルチスレッドのアプリケーション内のスレッドは、TPINVALIDCONTEXT を含め、どのようなコンテキスト状態で実行している場合でも、Frstrindex() または Frstrindex32() を呼び出すことができます。
戻り値
この関数は、エラー発生時に -1 を返し、Ferror を設定してエラー条件を示します。
エラー
次の条件の場合、Frstrindex() は異常終了し、Ferror を次の値に設定します。
バッファが適切なバウンダリで開始していません。
バッファがフィールド化されていないか、または Finit() で初期化されていません。
使用例
バッファをインデックスなしで送信するためには、次のような文が実行されます。
save = Funindex(fbfr);
num_to_send = Fused(fbfr);
transmit(fbfr,num_to_send); /* 関数プロトタイプ */
Frstrindx(fbfr,save);
これら 4 つの文は、次のことを実行します。
1. - /* インデックスを解除し、Frstrindx を保存する */
2. - /* 送信するバイト数を決める */
3. - /* インデックスなしで fbfr */
4. - /* インデックスをリストアする */
この場合、transmit() には、メモリ・ポインタおよび長さが渡されます。送信されるデータは、メモリ・ポインタで始まり、num_to_send バイトです。いったんバッファが送信されると、そのインデックスは、Frstrindex() を使用してリストアされます (どのような場合でも、transmit() が、インデックスを変更しないことが前提となっている)。送信の終わりを受信すると、フィールド化バッファを受け取ったプロセスは、Findex() を使用してそのバッファを次に示す方法でインデックスします。
receive(fbfr); /* 任意の場所から fbfr を取得する */
Findex(fbfr); /* fbfr をインデックスする */
受信プロセスは、次の理由により Frstrindx() を呼び出すことができません。
解決策としては、Findex() を明示的に呼び出すことです。もちろんユーザは、フィールド化バッファのインデックスのバージョンを自由に送信する (つまり、Fsizeof(*fbfr) バイトを送信する) ことができ、受信側の Findex() のコストを回避します。
関連項目
「FML 関数の紹介」、Findex、Findex32(3fml)、Fsizeof、Fsizeof32(3fml)、Funindex、Funindex32(3fml)
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|