4

16進パラメーターを受け入れるCの関数があります。この関数をC#から呼び出す必要があります。C関数が間違った数値を返しているため、現在のアプローチは正しくないようです。

これが私のC関数の宣言です:

enum tags {
    TAG_A = -1,
    TAG_B  = 0x00, 
    TAG_C = 0xC1,  
    ...
};
int myfunction(enum tags t);

これが私のC#コードです:

enum tags {
    TAG_A = -1,
    TAG_B  = 0x00, 
    TAG_C = 0xC1, 
    ...
    }

[DllImport ("mylibraryname")]
    public static extern int myfunction(tags t);

myfunction(tags.TAG_B);

私はMacを使用しており、MonoとXcodeを使用してこれらすべての作業を行っています。C関数は、私がダウンロードしたオープンソースライブラリであるため、正しいと見なすことができます。16進数に問題があると思いますが、よくわかりません。

解決:

私は1つの答えにチェックマークを付けましたが、実際にはC#列挙型を設定して問題を解決しました。したがって、C#では次のようになります。

列挙型タグ:long {TAG_A = -1、TAG_B = 0x00、TAG_C = 0xC1、...}

4

2 に答える 2

2

16 進数は、リテラル整数値を表現する別の方法です。あなたの問題とは無関係です。たとえばTAG_B = 0x00TAG_B = 0両方ともまったく同じ意味です。

問題はenum、C#enumが 32 ビットであるのに対し、C が 16 ビット整数であることです。C# で列挙型を作成する代わりに、単純なInt32値として実行してみてください。

static class tags 
{
    public static short TAG_A = -1;
    public static short TAG_B  = 0x00;
    public static short TAG_C = 0xC1;
    // ...
}

[DllImport ("mylibraryname")]
public static extern int myfunction(short t);

myfunction(tags.TAG_B);

enumまたは、LB が提案したように、メンバーのタイプを設定するだけです。

enum tags:short 
{
    TAG_A = -1,
    TAG_B  = 0x00, 
    TAG_C = 0xC1,
    // ...
}
于 2012-11-19T13:15:09.353 に答える
0

私のアーキテクチャ sizeof(enum_t) では、enum_t が列挙型の typedef であり、4 バイトを返すため、C# 列挙型も 4 バイトである場合、問題は見られません。

アーキテクチャの sizeof を使用して enum のサイズを確認してください。問題が別の場所にある場合は、それらを確認してください。

于 2012-11-19T13:16:31.533 に答える