C# 从c+返回数组和结构+;c语言中的函数# 我有C++编写的函数,我把它放在一个DLL中,用dLimPART在C语言中使用。一切正常;我能从C++获得返回值并显示在我的C语言GUI中。现在我想添加到该函数中,让它返回多个值(到目前为止为3个)。我尝试了和中给出的方法,但都没有成功。 第一篇文章中的代码给出了访问冲突错误,第二篇文章中的代码给出了结构的所有0值。对于第一个,我甚至完全复制了给定的代码,并尝试运行它,但没有效果。是什么导致这些方法给出的错误和错误值?我怎样才能让他们工作

C# 从c+返回数组和结构+;c语言中的函数# 我有C++编写的函数,我把它放在一个DLL中,用dLimPART在C语言中使用。一切正常;我能从C++获得返回值并显示在我的C语言GUI中。现在我想添加到该函数中,让它返回多个值(到目前为止为3个)。我尝试了和中给出的方法,但都没有成功。 第一篇文章中的代码给出了访问冲突错误,第二篇文章中的代码给出了结构的所有0值。对于第一个,我甚至完全复制了给定的代码,并尝试运行它,但没有效果。是什么导致这些方法给出的错误和错误值?我怎样才能让他们工作,c#,c++,arrays,struct,dllimport,C#,C++,Arrays,Struct,Dllimport,为了以防万一,下面是我自己的代码和第二篇文章的实现 二等分 struct Result { double root; double relError; double absError; }result; extern "C" {__declspec(dllexport) Result bisection( double l, double u, double stoppingError, int maxIter); } 二等分 Result bisection(dou

为了以防万一,下面是我自己的代码和第二篇文章的实现

二等分

 struct Result
{
    double root;
    double relError;
    double absError;
}result;
extern "C" {__declspec(dllexport) Result bisection( double l, double u, double stoppingError, int maxIter); }
二等分

Result bisection(double l, double u, double stoppingError, int maxIter) {
//code for this function
result.root = xr;
result.relError = e;
result.absError = 1;    
return result;
}
c#代码


你的代码几乎是正确的。调用约定不匹配。C++代码使用CDEL,C语言的STDCALL。更改一个,使它们匹配

你的头有一个
二等分
返回一个
二等分
,而实现返回一个
结果
。啊!这是我在这里发布代码时犯的一个错误。我已经修复了它。也许最好把结果作为out参数而不是返回它,并让C++代码在已通过的<<代码>结果< /代码>中填写。这将遵循您如何调用需要“返回结构”(如
GetMessage
)的Windows API函数的模型。PaulMcKenzie抱歉,我的回答太晚了。这是个好主意。我已经实现了它,它工作得很好;我不必处理数组和编组。我可以直接得到我需要的值。。另外,它释放了返回值,我现在可以使用它来确定函数是否正常运行。我期待着不会发生的情况;表示函数成功或失败的整数返回值是一个救生圈。非常感谢。是的,就是这样;这就是我们所做的。我复制粘贴了一些在线来源的代码,我一定是在编辑以满足我的需要时把它弄糟了。我阅读了调用约定和默认的stdcall;一旦我改变了,按照你的指示,代码就起作用了。谢谢
    [StructLayout(LayoutKind.Sequential)]
    public struct Result
    {
        public double root;
        public double relError;
        public double absError;            
    }
    [DllImport(dllPath)]
    private static extern Result bisection(double l, double u, double stoppingError, int maxIter);

Result result = bisection(data[0], data[1], 0.1, 100);