我正在制作一个 c# 程序来绘制用 c 计算的三次样条曲线,这是程序的互操作部分
我的 C# 代码:
[DllImport(@"..\..\..\Debug\Spline_Core.dll")]
static extern IntPtr mult_points(Point[] points, int points_count, double factor);
public Form1()
{
InitializeComponent();
var points = new[]
{
new Point { x = 2, y = 3 },
new Point { x = 5, y = 7 },
};
var sum = mult_points(points, 2, 2);
var mult = (Point[])Marshal.PtrToStructure(sum, typeof(Point[]));
}
和C代码:
typedef struct point
{
double x, y;
} Point;
extern __declspec(dllexport) Point* __stdcall mult_points(Point* points, int points_count, double factor)
{
int i;
Point* mult_points = (Point*)malloc(points_count * sizeof(Point));
for (i = 0; i < points_count; i++)
mult_points[i] = create_point(points[i].x * factor, points[i].y * factor);
return mult_points;
}
我可以通过参数将点数组从 c# 传递到 c,但我无法取回它。
Point*
在技术上只是指向单个 Point
结构的指针。编码器不知道它是否是一个数组或这样的数组中有多少个元素。所以你对 Point[]
的转换是错误的。
为了更好地理解,请看这个简单的例子——而不是这段代码:
var sum = mult_points(points, 2, 2);
var mult = (Point[])Marshal.PtrToStructure(sum, typeof(Point[]));
...你可以使用这样的东西:
IntPtr sum = mult_points(points, 2, 2);
int structSize = Marshal.SizeOf(typeof(Point));
for (int i = 0; i < numberOfPoints; i++)
{
IntPtr curr = sum + (i * structSize);
Point pt = (Point)Marshal.PtrToStructure(curr, typeof(Point));
// Add pt to List<Point> for example
}
这不是一个理想的解决方案,但我希望您明白这一点。可以在这里找到更好(更优雅)的解决方案:How do I marshall a pointer to a pointer of an array of structures?
我是一名优秀的程序员,十分优秀!