【问题标题】:Are double* and double** blittable types? C#double* 和 double** 是 blittable 类型吗? C#
【发布时间】:2009-11-19 19:43:36
【问题描述】:

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

我知道 double 是一种 blittable 类型,所以 C++ 中的 double 与 C# 中的 double 相同。 那么 double** 呢,它会转换成 double[,] 吗?

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

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

如何将这个函数DLLImport到C#?

提前致谢

【问题讨论】:

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


    【解决方案1】:

    声明没有意义。如果函数接受一个指向双精度数组的指针,那将是有意义的,但声明将是

    int get_values(double* array, int size);
    

    其中 size 将给出客户端分配的数组的大小,函数的返回值表示实际复制到数组中的双精度数。等效的 P/Invoke 声明将是:

    [DllImport("blah.dll")]
    private static extern int get_values(double[] array, int size);
    

    在调用函数之前,您必须将数组分配为您承诺的大小。

    但是 double** 参数是一个挂断。这可能意味着该函数返回一个指向双精度数组的指针,但是 size 参数几乎没有意义。因为它是拥有数组并控制其大小的函数。或者这可能意味着客户端传递了一个二维数组,但只有一个大小参数是没有意义的。

    请用对函数作用的正确解释更新您的问题。

    【讨论】:

      【解决方案2】:

      This article 说如下:

      以下复杂类型也是 blittable 类型:

      blittable 的一维数组 类型,例如整数数组。 但是,包含 blittable 类型的可变数组是 本身不是 blittable。

      【讨论】:

        【解决方案3】:

        在函数参数类型的上下文中,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**double*[] 的情况类似,但请注意 double[][](无大小)不同,大小表示指向数组的指针(您必须指定除一维之外的所有维度)。

        听起来确实像您在不需要 double** 时使用它。将数组作为double* 传递是否适合您?

        int get_values(double* array, int size);
        
        void func() {
          double a[10];
          get_values(a, 10);
        }
        

        (我知道我没有回答您的 DLLImport 问题,我不知道答案。)

        【讨论】:

        • 我认为技术要求是sizeof(double*) <= sizeof(void*)(因为您可以将任何指向对象的指针放入void* 并将其取出),但它们通常大小相同.它甚至可能更奇特。
        猜你喜欢
        • 2021-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-23
        • 1970-01-01
        • 2020-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多