我正在为民意调查编写一个程序,我使用的是“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});
.
.
.
}
答案 0 :(得分: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&lt;&gt;如果需要传递给本机函数,请暂时将其固定。
答案 1 :(得分:1)
您的char数组Riposta
已在头文件中正确声明。您在构造函数中执行的操作是创建大小为Riposta
的本地char数组Ndomande
。虽然我不知道它来自哪里。