【问题标题】:C/C++ functions returning NaN in MonoTouch when p/invoked调用/调用时,C/C++ 函数在 MonoTouch 中返回 NaN
【发布时间】:2011-07-26 19:23:23
【问题描述】:

我有两个源文件:

文件.h:

class Numbers
{
public:
    int Get10();
    int Get192();   
    float GetFloat();
};

文件.cpp:

int Numbers::Get10()
{
    return 10;
}
int Numbers::Get192()
{
    return 192;
}
float Numbers::GetFloat()
{
    return 3213.1294124f;
}

extern "C"
int Get10()
{
    Numbers n;
    return n.Get10();
}

extern "C"
int Get192()
{
    Numbers n;
    return n.Get192();
}

extern "C"
int GetFloat()
{
    Numbers n;
    return n.GetFloat();
}

我将它们编译成一个静态库 (libNumbers.a) 并通过以下 mtouch 参数将其与 MonoTouch 链接:

-v -v -v -gcc_flags "-cxx -framework Security -L${ProjectDir} -lNumbers -force_load ${ProjectDir}/libNumbers.a"

然后在 C# 源文件中我有这个:

    [DllImport("__Internal",EntryPoint="GetFloat")]
    public static extern float GetFloat();

当我从 C# 源文件中调用 GetFloat() 时,返回的值是 'NaN' 而不是 3213.1294124f。但是,如果我调用 Get10,我实际上会返回正确的值。

【问题讨论】:

    标签: c# c++ c xamarin.ios pinvoke


    【解决方案1】:

    也许将这个函数的返回类型更改为float 是要走的路?

    extern "C"
    int GetFloat()
    {
        Numbers n;
        return n.GetFloat();
    }
    

    【讨论】:

    • 很好看!可惜它没有解决我的问题 :( 仍然从 GetFloat 获得 NaN,我什至从 Get10 获得 NAN,所以我认为它与函数本身无关。
    • @meds,实际上,您究竟如何获得整数值的 NAN?请提供 C# 代码中其他函数的声明。
    • @meds,再等一下,在你说Get10 产生正确结果的问题中。请澄清一下。
    • 很抱歉给您带来了困惑!我刚刚发现我的错误在于我如何在 C# 中声明函数,一旦我按照你的回答修改了 C++ 源文件,我忘记了我在 C# 文件中将 extern 函数的返回时间更改为 int 并导致我感到困惑。我只想说你的答案实际上是我的问题的解决方案,但我很困惑,因此为什么会混淆。很抱歉!
    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2016-08-03
    • 2018-09-16
    • 2016-03-26
    • 2019-08-12
    • 2017-12-16
    • 2023-01-23
    相关资源
    最近更新 更多