4

次のような C API があります。

typedef void (*cprcen_channel_callback) (CPRC_abuf *abuf, void *user_data);
int CPRCEN_engine_set_callback(CPRCEN_engine *eng, CPRCEN_channel_handle chan,
    void *userdata, cprcen_channel_callback callback);

ご覧のとおり、CPRCEN_engine_set_callback関数はコールバックの前にユーザー データを受け取りますが、デフォルトでは、Vala はそれが後で来ることを期待しています。CCode属性のdelegate_target_posパラメーターについては知っていますが、指定した位置に関係userdataなく、生成された関数呼び出しの 3 番目の引数ではなく、最初の引数として値が提供されます。Vala のパラメーター配置ロジックに頭を悩ませているようには見えません。

バインディングを最終的にどのように見せたいかを次に示します。

[CCode(cname = "cprcen_channel_callback", has_target = true)]
public delegate void ChannelCallback(AudioBuffer abuf);

[Compact]
[CCode(cname = "CPRCEN_engine")]
public class Engine {
    [CCode(cname = "CPRCEN_engine_set_callback")]
    public int set_channel_callback(ChannelHandle chan, ChannelCallback callback);
}

どうすればこれを機能させることができますか?

4

1 に答える 1

4

1.5動作するはずです:

[CCode(cname = "CPRCEN_engine_set_callback")]
public int set_channel_callback(ChannelHandle chan, [CCode (delegate_target_pos = 1.5)] ChannelCallback callback);

ロジックは非常に単純です。1.5 は、最初の引数 (chan) と 2 番目の引数 (コールバック) の間です。2 番目と 3 番目の間が必要な場合は、2.5 などを使用できます。

インスタンスの前に置きたい場合は、少しだけ複雑になります。その場合は、0 から 1 の間 (たとえば 0.5) を使用し、instance_pos CCode 属性を使用して、インスタンスを 1 未満で大きい値に設定します。 0.5 より (例: 0.9)。

于 2015-08-18T01:25:27.267 に答える