是双*和双** blittable类型? C#

时间:2009-11-19 19:43:36

标签: c# .net c++ interop marshalling

我有一个关于将C ++数组编组到C#的问题。 double *会自动转换为double []吗?

我知道double是一个blittable类型,因此C ++中的double与C#中的double相同。 那么双**呢,它会转换为double [,]吗?

我有以下非托管功能:   int get_values(double ** param,int sz)

其中param是指向双精度数组的指针,sz是大小。

我怎样才能将此函数DLLImport到C#?

提前致谢

3 个答案:

答案 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问题,我不知道答案。)