C++ cli 如何在托管指针数组c++/cli?

C++ cli 如何在托管指针数组c++/cli?,c++-cli,C++ Cli,我是托管代码新手,我需要使用C++/CLI将指向不同结构的指针数组传递到windows窗体,但它不起作用 我的问题是在托管阵列中,如何正确访问其元素 代码顺序: array<void*> ^ ptr;//here ptr value is undefined , type array<void*> ^ ptr = gcnew array<void*> (2);// length 0x2 , 0x0 and 0x1 values are undefined of

我是托管代码新手,我需要使用C++/CLI将指向不同结构的指针数组传递到windows窗体,但它不起作用

我的问题是在托管阵列中,如何正确访问其元素

代码顺序:

array<void*> ^ ptr;//here ptr value is undefined , type array<void*> ^
ptr = gcnew array<void*> (2);// length 0x2 , 0x0 and 0x1 values are undefined of type void

class1::struct1 structObj1;
class2::struct2 structObj2;

ptr[0] = &structObj1;// value is empty of type void!!
ptr[1] = &structObj2;//value is empty of type void!!
有人能看出问题出在哪里吗


我是否需要使用非托管阵列然后转换为托管阵列?如果是,我该如何做???

在托管数组中传递非托管指针可能是有效的C++/CLI,但这绝对不是理想的方法。请考虑创建一个自定义托管类(C++中的代码> REF类< /COD>)来保存结构,而不是通过指针。 对于这一点,我假设struct1和struct2是无管理的结构。只有在这种情况下,这个答案才适用

你现有的代码适合我。这是我的版本,添加了一些调试

public struct struct1 { int foo; };
public struct struct2 { float bar; };

int main(array<System::String ^> ^args)
{
    array<void*> ^ ptr;
    ptr = gcnew array<void*> (2);

    for(int i = 0; i < ptr->Length; i++)
        Debug::WriteLine("ptr[{0}] = {1:X8}", i, reinterpret_cast<int>(ptr[i]));

    struct1 structObj1;
    struct2 structObj2;

    ptr[0] = &structObj1;
    ptr[1] = &structObj2;

    for(int i = 0; i < ptr->Length; i++)
        Debug::WriteLine("ptr[{0}] = {1:X8}", i, reinterpret_cast<int>(ptr[i]));

    struct1* pointerToStructObj1 = reinterpret_cast<struct1*>(ptr[0]);

    structObj1.foo = 4;
    Debug::WriteLine("pointerToStructObj1->foo = {0}", pointerToStructObj1->foo);
}
public struct struct1{int foo;};
公共结构struct2{float bar;};
int main(数组^args)
{
数组^ptr;
ptr=gc新阵列(2);
对于(int i=0;iLength;i++)
调试::WriteLine(“ptr[{0}]={1:X8}”,i,reinterpret_cast(ptr[i]);
struct1 structObj1;
struct2 structObj2;
ptr[0]=&structObj1;
ptr[1]=&structObj2;
对于(int i=0;iLength;i++)
调试::WriteLine(“ptr[{0}]={1:X8}”,i,reinterpret_cast(ptr[i]);
struct1*pointerToStructObj1=重新解释强制转换(ptr[0]);
structObj1.foo=4;
调试::WriteLine(“pointertostroctobj1->foo={0}”,pointertostroctobj1->foo);
}
输出:

ptr[0] = 00000000 ptr[1] = 00000000 ptr[0] = 0013F390 ptr[1] = 0013F394 pointerToStructObj1->foo = 4 ptr[0]=00000000 ptr[1]=00000000 ptr[0]=0013F390 ptr[1]=0013F394 指针ToStructObj1->foo=4
编辑 要使用Debug::WriteLine,请使用命名空间System::Diagnostics添加

调试器不知道如何显示
void*
的内容,所以它只显示blank。它确实以不同的方式显示空指针:空指针显示为
,非空指针显示为空白

我的C++/CLI理念是:如果要编写托管代码,就要编写托管代码。考虑用托管列表替换向量。如果您仍然需要非托管对象,我强烈敦促您考虑使用适当类型指针来编写托管类,而不是使用<代码> Value*/Cux>数组。p>
要实现这样一个类,创建您需要的任何字段,只要确保它们是指针,而不是直接的。(
vector*
而不是
vector
)在构造函数中使用
new
创建对象,并在析构函数(在Dispose上调用)和finalizer中
delete
删除对象。

CLR和调试器对于void*都没有多大用处。没有可用的类型信息。目前还不清楚“struct1”可能是什么类型,如果它是非托管结构,则无法在Winforms应用程序中对其执行任何操作。如果它是被管理的,那么前面的一个方法就是使用Object^数组。Winforms代码仍然很糟糕,但至少有机会。他可能正在用C++/CLI编写Winforms应用程序,需要一种方法将非托管数据从一个托管类传递到另一个托管类。非常感谢您的回复,这非常有帮助,但我有一些顾虑:1-为什么正常的强制转换不起作用,即(struct*)(ptr[0])…它说可以
t从void*转换为struct*?!2-我们是否需要包含某些头才能使用Debug::WriteLine,因为它不适合我!!3-你知道为什么使用watch工具吗,我在ptr值中看不到任何东西,我们也可以在控制台上显示它的值(我使用cout)-顺便说一下,我使用指针,因为我的结构是非托管的,它包含向量,所以我不能在ref类中定义它作为直接使用它的内容,除了指针,还有其他方法吗?忘记常规的施法问题(qs 1),因为在更改代码位置后,它可能会起作用。@David:你说得对,void*数组不太好,在没有任何结构的非托管类中收集非托管变量,然后在需要时为该类创建ptr作为成员变量,并在构造函数/析构函数中为类创建new/delete,这是否比为托管类中的每个非托管对象创建*、new、delete好??@David:另一个问题,如果我
ve两个类a和b,那么在类a中我创建了成员变量*to b,在构造函数中创建了新的b,在析构函数中删除,类a调用类b方法传递前一个成员变量,然后在类b中访问b的成员变量,在b的成员函数中访问b的成员变量
谢谢。 ptr[0] = 00000000 ptr[1] = 00000000 ptr[0] = 0013F390 ptr[1] = 0013F394 pointerToStructObj1->foo = 4