0

我发现在使用 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。

4

1 回答 1

0

今天,我上个月在 Microsoft Connect 上发布了以下回复:

来自 Microsoft Connect 的问候!此通知是为反馈项目生成的:768001

Visual Studio 2012 调试器无法计算您在 Microsoft Connect 站点提交的托管 C++/CLI 数组的索引。您好乔恩,感谢您报告此问题。我们还没有修复,目前也没有计划在下一个版本中修复这个问题,但会在未来的版本中考虑它。再次感谢。马克·潘恩

于 2012-11-12T21:20:43.090 回答