2012-01-25 3 views
0

Cで実装されたリンクリストデータ構造を作成したかったのです。リストNIFを使用してコール間で状態を保持するCコードと対話する方法(つまり、リンクリストをNIFとして)

ll:new() -> listId. 

ListIdは、上記リストのハンドルのいくつかの種類として機能するCコードに戻って渡されるであろういくつかのタイプの「ポインタ」を表します。私は、リストが非常に大きくなる可能性があると想像して以来、リスト自体を前後に渡す必要がないことを望んでいました。リンクリストを作成した後は、ユーザーは、明白な方法でそれと相互作用する:

ll:add(ListId, Elt) 
ll:add_after(ListId, Pos, Elt) 

は、私はアーランのNIF機能を経由してこれを行うだろうと想像しました。これがうまくいくためには、C側はadd、add_afterなどの複数の呼び出しでリストを維持する必要があります。

まっすぐなCでは、ユーザがプログラムを生き残らせる主な機能を持っていますユーザーがプログラムとやりとりする間、リンクされたリストを保持し続ける。私が理解しているように、NIFは主な機能を持たないCコードを利用しています。つまり、NIFへの各呼び出しは、1つのやり方の命題です。

NIFを利用して複数のコールにまたがって状態を保持する必要があるCコードと対話する方法について、誰かが私に(適切であると仮定して)どのように指摘できるでしょうか?私はそれがはっきりしたことを望む!

+0

ListId - リスト全体が何らかの形で含まれているか、またはC部分のメモリへの参照(直接的または間接的)のみが含まれていますか? –

+0

@OdobenusRosmarus、ListIdはリンクされたリストへの参照であり、リスト自体ではありません – Jr0

答えて

1

リソースオブジェクトにはthe documentationを確認してください。 NIF APIでは、erlang GCを使用して、作成したプロセスがクラッシュした場合に作成するリストをGCすることもできます。

0

Cの 'static'変数は呼び出し間で値を保持できますが、この方法を強く推奨しません。何らかの状態が必要な場合は、erlangの 'ports'を見るほうがよいでしょう。

関連する問題