0

我正在编写一个民意调查程序,我使用“Partito”类,

#pragma once

ref class Partito
{
protected:
    //System::String ^nome;
    int IndexP;             //Index Partito
    float MaxConsenso;
    float consensoTot;
    int consenso;
//workaround according to Hans Passant:
//  char Risposta[5];           
    array<int> ^Risposte;// Risposte means anwers.
//workaround end
System::Drawing::Color colore;

public:
    Partito(
        int _IndexP,
      float _consensoTot, int consenso

        array<int> ^_Risposte      // workaround

);      //costruttore

    void CalcCons(int consenso);

    float GetConsensoTot(void);
};
    };

现在定义:

#include "StdAfx.h"
#include "Partito.h"

//Partito::Partito(void)
Partito::Partito(
              int _IndexP,
            float _consensoTot,
            int consenso
//workaround start
            array<int> ^_Risposte //workaround
//workaround end
)
{
        //char Risposta[5]; 
//workaround start
     Risposte=gcnew array<int>(5); //workaround
    Risposte=_Risposte; //workaround
//workaround end.
    IndexP =_IndexP;
    consensoTot = _consensoTot;
    MaxConsenso = 12;
}
void Partito::CalcCons(int consenso)
{

consensoTot+=(consenso*100)/MaxConsenso;
}

float Partito::GetConsensoTot(void)
{
    return consensoTot;
}

现在,通过解决方法,编译器可以毫无问题地接受它。现在,在文件“Form1h”中,我可以毫无问题地初始化数组:

Form1(void)
{
            InitializeComponent();
            //
            //TODO: aggiungere qui il codice del costruttore.
            //

我定义了一个对象,以这种方式初始化数组。

Partito^ ExampleParty = gcnew Partito(0,0,0,gcnew array<int>{0,1,2,2,0});
.
.
.
}
4

2 回答 2

2

这段代码可以归结为一个简单的例子:

ref class foo {
public:
    int array[6];   // C4368: mixed types are not supported
};

这里发生的是 C++/CLI 编译器,可以让您免于摔倒。一个可能看起来像这样的镜头:

foo^ obj = gcnew foo;
NativeFunction(obj->array, 6);

NatievFunction() 将 int* 作为参数。当垃圾收集器启动时,这是致命的,就像 NativeFunction() 正在执行一样。当它压缩堆时,它将在内存中移动foo 对象。使 int* 无效。当本机函数现在读取垃圾或在写入数组时破坏 GC 堆时,灾难就会发生。

解决方法是使用 int* 而不是 int[] 以便数组的内存是使用new运算符从本机堆分配的,因此总是稳定的。在构造函数中分配它,您将需要一个析构函数和一个终结器来再次释放它。或者只使用托管数组,array<int>^在这种情况下。如果需要将其传递给本机函数,您可以使用 pin_ptr<> 临时固定它。

于 2013-09-19T19:32:25.103 回答
1

您的 char 数组Riposta在头文件中正确声明。您在构造函数中所做的是创建一个Ripostasize的本地 char 数组Ndomande。虽然我不知道那是从哪里来的。

于 2013-09-19T19:10:46.517 回答