我的问题是:我需要用F#设计一个程序,从一个C++程序,执行简单的3D向量计算。我不分享下面代码的计算,因为问题停止在根据 * printfn * 创建向量。
所以我觉得是错误,但是我macOS的同学没有问题,可以正确运行代码,我推断是Windows的问题,可能是指针的问题,所以我就靠你来帮我了。
多谢了。
PS:网络版7.0.101当啷版15.0.5
- 矢量3.cpp**
#include <math.h>
#include <iostream>
using namespace std;
int main()
{
return 0;
}
class Vector3
{
public:
double X;
double Y;
double Z;
Vector3(double x, double y, double z) : X(x), Y(y), Z(z) {}
};
extern "C" Vector3* CreateVector3(double x, double y, double z)
{
Vector3* v = new Vector3(x, y, z);
return v;
}
- 程序. fs**
open System.Runtime.InteropServices
[<StructLayout(LayoutKind.Sequential)>]
printfn("test 1: Launching the program")
type Vector3 =
val mutable X: double
val mutable Y: double
val mutable Z: double
new(x, y, z) = { X = x; Y = y; Z = z }
[<DllImport("compiledVector3.exe")>]
extern Vector3 CreateVector3(double x, double y, double z)
[<DllImport("compiledVector3.exe")>]
extern double GetX(Vector3 v)
[<DllImport("compiledVector3.exe")>]
extern double GetY(Vector3 v)
[<DllImport("compiledVector3.exe")>]
extern double GetZ(Vector3 v)
[<DllImport("compiledVector3.exe")>]
extern double distanceTo(Vector3 v,Vector3 v2)
[<DllImport("compiledVector3.exe")>]
extern void vectorMovement(Vector3 v,double plusx, double plusy, double plusz)
[<DllImport("compiledVector3.exe")>]
extern Vector3 midpoint(Vector3 v,Vector3 v2)
[<DllImport("compiledVector3.exe")>]
extern double percentDistance(Vector3 pos1, Vector3 pos2, double percent)
printfn("test 2: DLL imported")
let FstVector= CreateVector3(0.0, 0.0, 0.0)
let SndVector= CreateVector3(1.0, 2.0, 3.0)
printfn("test 3: Vectors created")
我尝试使用基本的dotnet run命令启动Program. fs,希望在终端中看到以下行:
test 1: Launching the program
test 2: DLL imported
test 3: Vectors created
但没有第三行。
- 终点站**
PS C:\Users\AlexisLasselin\Documents\GitHub\2022-2023-project-3-harfang3d-binding-Project-4-group\CppToFs\Vector3> dotnet run
test 1: Launching the program
test 2: DLL imported
PS C:\Users\AlexisLasselin\Documents\GitHub\2022-2023-project-3-harfang3d-binding-Project-4-group\CppToFs\Vector3>
1条答案
按热度按时间5t7ly7z51#
C++对于自由函数的默认调用约定是Cdecl,与平台无关,但是
DllImport
属性的默认调用约定是与平台相关的,在macOS上是Cdecl,而在Windows上不是(这里是StdCall)。幸运的是,修复很简单: