我有一个关于将C ++数组编组到C#的问题。 double *会自动转换为double []吗?
我知道double是一个blittable类型,因此C ++中的double与C#中的double相同。 那么双**呢,它会转换为double [,]吗?
我有以下非托管功能: int get_values(double ** param,int sz)
其中param是指向双精度数组的指针,sz是大小。
我怎样才能将此函数DLLImport到C#?
提前致谢
答案 0 :(得分:2)
声明毫无意义。如果函数接受指向双精度数组的指针,那么这将是有意义的,但声明将是
int get_values(double* array, int size);
其中size将给出客户端分配的数组大小,函数的返回值表示实际复制到阵列中的双精度数。等效的P / Invoke声明将是:
[DllImport("blah.dll")]
private static extern int get_values(double[] array, int size);
在调用函数之前,必须使用new承诺的数组分配数组。
但是双**论证是一个挂断。这可能意味着该函数返回一个指向双数组的指针,但是size参数没有意义。因为它是拥有数组并控制其大小的函数。或者它可能意味着客户端传递一个二维数组,但是只有一个大小参数是没有意义的。
请使用对该功能的正确解释来更新您的问题。
答案 1 :(得分:0)
This article说以下内容:
以下复杂类型也是 blittable类型:
一维阵列的blittable 类型,例如整数数组。 但是,包含一个类型的类型 可变数组的blittable类型是 本身并不幸福。
答案 2 :(得分:0)
在函数的参数类型的上下文中,double*
和double[]
是相同的:
void f(double* p);
void g(double p[]);
void h(double p[10]); // even if you supply a size! (it's ignored)
void i(double (&a)[10]); // now this is different
在其他情况下,他们不是:
void j() {
double a[10]; // sizeof a == sizeof(double) * 10
double* p; // sizeof p == sizeof(void*)
}
double**
vs double*[]
的情况类似,但是注意double[][]
(没有大小)是不同的,而大小意味着指向数组的指针(你必须指定所有但是一个维度。
听起来好像你在不需要时使用double**
。只是将数组作为double*
传递给你吗?
int get_values(double* array, int size);
void func() {
double a[10];
get_values(a, 10);
}
(我知道我没有回答你的DLLImport问题,我不知道答案。)