driver_output_term
反対方向、つまり最初に iolist に変換せずに Erlang 項をドライバに送信することと同等のものはありますか? そうでない場合は、おそらく ; を使用して用語を変換term_to_binary
し、C 側でei
;を使用して解析する必要があります。良い例はありますか?
1 に答える
2
ドキュメントによると、iodata()
フォーマットされたもののみを送信できます。
ドライバーに送信したいのが整数と文字列だけの場合は、Erlang ドキュメントのこのチュートリアルのように、用語から iodata への独自のエンコーディングを使用する方が効率的 (そしてはるかに簡単) かもしれません。関数を使用して、呼び出しをドライバーに直接送信できるマッピングに変換するため、 を使用してエンコードする必要はありませんterm_to_binary()
。
encode({foo, X}) -> [1, X];
encode({bar, Y}) -> [2, Y].
このマッピングは、 および が小さい整数であると想定される場合に実現可能X
ですY
。C 側では、入力バッファーの最初のバイトがオンに切り替えられ、2 番目のバイトを引数として使用して適切な関数が呼び出されます。
static void example_drv_output(ErlDrvData handle, char *buff, int bufflen)
{
example_data* d = (example_data*)handle;
char fn = buff[0], arg = buff[1], res;
if (fn == 1) {
res = foo(arg);
} else if (fn == 2) {
res = bar(arg);
}
driver_output(d->port, &res, 1);
}
于 2010-11-30T00:50:41.873 に答える