簡體   English   中英

P /調用-簡單添加結構參數

[英]P/Invoke - simple addition of struct parameters

我有這個C代碼:

real_T addition(const struct_T parameters)
{
    return parameters.a + parameters.b;
}

typedef struct
{
    real_T a;
    real_T b;
} struct_T;

typedef double real_T;

我像這樣從C#調用它:

using System.Runtime.InteropServices;

    namespace AdditionConsoleApplication
    {
        class Program
        {
            [DllImport(@"X:\Bla\Addition.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern double addition(struct_T parameters);

            static void Main(string[] args)
            {
                struct_T parameters = new struct_T();
                parameters.a = 1;
                parameters.b = 3;

                Console.WriteLine(addition(parameters));
            }
        }
    }

這里的struct_T:

[StructLayout(LayoutKind.Sequential)]
class struct_T
{
    public double a;
    public double b;
}

不幸的是,數學是不正確的:

2.72645911468311E-284

誰能看到錯誤嗎?

您具有以下結構定義:

[StructLayout(LayoutKind.Sequential)]
class struct_T
{
    public double a;
    public double b;
}

p / invoke編組將通過引用來編組課程。 換句話說,將指向對象的指針傳遞給本機代碼。 此不匹配說明了程序失敗的原因。

解決方案是確保接口的兩側都匹配。 一種方法是通過雙方的價值傳遞。 一種簡單的實現方法是在C#中將結構聲明為值類型。 通過使其成為結構來實現:

[StructLayout(LayoutKind.Sequential)]
struct struct_T
{
    public double a;
    public double b;
}

另一種方法是在兩側都通過引用。 您可以通過在C#端使用class並更改C代碼來實現。

real_T addition(const struct_T* parameters)
{
    return parameters->a + parameters->b;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM