-1

这是我在 StackOverFlow 中的第一篇文章!

我正在尝试理解 C++/CLI,我有一个具有两个属性的非托管结构getLxsetLx,它分别检索指向 double 的指针并接受指向 double 的指针。所以我setLx在非托管方法中填充值,并尝试从getLx托管范围内检索值。我想将在非托管堆上分配的数据转换或获取到托管堆。

所以基本上在下面的示例代码中,我需要来自本机本机指针引用类型double^ 的引用类型double*

 /*Unmanaged Struct*/
    struct Grid2D
        {
        double* getLx() const {
            return _Lx;
            }
        void setLx(double* val) {
            _Lx = val;
            }
        private:
            double* _Lx;
        public:
            int _count;
        };

    #pragma unmanaged
    void UnmanagedFillGrid(Grid2D& d)
        {
        printf_s("\nunmanaged");
        double* item = new double[d._count];
        int i = 0;
            while (i++ < d._count) {
                int r = (rand() % 100) + 1;
                item[i] = r;
                printf_s("array[%d] = %f\n", i, item[i]);
                }
            d.setLx(item);
        }

    #pragma managed  
    int main(array<System::String ^> ^args)
    {
        Grid2D d;
        d._count = 10;
        UnmanagedFillGrid(d);   
        Console::WriteLine("[managed] count = {0}", d._count);
        //getLx returns pointer to double, I need to get in double^
        //Is this possible ?
        double^ managedLx = d.getLx();//How to convert ?? 


        return 0;
    }
4

1 回答 1

2

第一:虽然它是 C++/CLI 中的有效类型,但您不应该使用double^. 对值类型的托管引用是奇怪的、不必要的,并且在其他.Net 语言(例如,C#)中根本不存在。

所以,看起来你double*是一个数组。托管数组类型是array<double>^,不是double^。这就是您应该在托管方面使用的内容。托管数组也知道自己的长度,因此您不需要单独公开计数。

为了将数据从 移动double*array<double>^,它需要被复制。无法创建array对象以使其使用由其他对象分配的内存,因此复制数据是唯一的可能性。您可以使用该Marshal::Copy方法,也可以使用for循环并自己复制数据。(他们归结为同一件事。)

于 2017-03-27T16:07:33.833 回答