我发现在使用 C++/CLI 的托管数组的 VS2012 调试器显示中似乎存在异常。似乎当我尝试对索引使用简单的数学表达式时,调试器会改为显示元素 0。请参阅下面的观察窗口。
数组的声明如下所示。
/* Stack where the values of tokens are stored */
array<YYSTYPE>^ yyv = gcnew array<YYSTYPE> (YYMAXDEPTH);
如果元素被展开,它肯定会显示 yyv[4-1] 元素与 yyv[0] 元素具有相同的地址。
在 C++/CLI 的 Visual Studio 调试器中,是否不能对托管对象的默认索引器使用表达式?
YYSTYPE 被声明为包含单个 Object^ 引用的托管值结构,如下所示:
value struct YYSTYPE
{
Object^ obj;
/* Constant integer value */
property long int4
{
long get() { return safe_cast<long>(obj); }
void set(long value) { obj = safe_cast<Object^>(value); }
}
/* Constant floating point value */
property float fp
{
float get() { return safe_cast<float>(obj); }
void set(float value) { obj = safe_cast<Object^>(value); }
}
/* Constant string */
property String^ str
{
String^ get() { return safe_cast<String^>(obj); }
void set(String^ value) { obj = safe_cast<Object^>(value); }
}
/* Expression or Expression Tree */
property ExprC^ exprR
{
ExprC^ get() { return safe_cast<ExprC^>(obj); }
void set(ExprC^ value) { obj = safe_cast<Object^>(value); }
}
/* List of expressions used for parameter lists */
property List<ExprC^>^ exprListR
{
List<ExprC^>^ get() { return safe_cast<List<ExprC^>^>(obj); }
void set(List<ExprC^>^ value) { obj = safe_cast<Object^>(value); }
}
/* List Of instructions */
property InstrListC^ instrListR
{
InstrListC^ get() { return safe_cast<InstrListC^>(obj); }
void set(InstrListC^ value) { obj = safe_cast<Object^>(value); }
}
/* Instruction with actual parameters */
property InstrC^ instrR
{
InstrC^ get() { return safe_cast<InstrC^>(obj); }
void set(InstrC^ value) { obj = safe_cast<Object^>(value); }
}
/* Run-time expression operator */
property OperatorC^ operatorR
{
OperatorC^ get() { return safe_cast<OperatorC^>(obj); }
void set(OperatorC^ value) { obj = safe_cast<Object^>(value); }
}
/* Instruction definition */
property InstrDefC^ instrDefR
{
InstrDefC^ get() { return safe_cast<InstrDefC^>(obj); }
void set(InstrDefC^ value) { obj = safe_cast<Object^>(value); }
}
/* Instruction definition */
property List<String^>^ stringListR
{
List<String^>^ get() { return safe_cast<List<String^>^>(obj); }
void set(List<String^>^ valueIR) { obj = safe_cast<Object^>(valueIR); }
}
};
添加了 10-18-12 16:24 PDT 我已经能够使用更简单的 C++/CLI 程序来重现这一点。
void main()
{
array<int>^ intarray = gcnew array<int>(10);
intarray[0]=0;
intarray[1]=1;
intarray[2]=2;
intarray[3]=3;
intarray[4]=4;
intarray[5]=5;
}
为最后一行设置断点,然后在监视窗口中输入 intarray[3] 和 intarray[4-1]。[4-1] 元素显示 0。