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を使用するVisualStudioデバッガーで管理対象オブジェクトの既定のインデクサーに式を使用することはできませんか?
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-1216:24PDTを追加しました。これをはるかに単純な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を表示します。