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を使用する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を表示します。

4

1 に答える 1

0

今日、先月MicrosoftConnectにこれを投稿したことに対して次の応答がありました。

Microsoft Connectからのご挨拶!この通知はフィードバックアイテム:768001に対して生成されました

Visual Studio 2012デバッガーは、MicrosoftConnectサイトで送信したマネージC++/CLIアレイのインデックスの計算に失敗します。こんにちはジョン、この問題を報告していただきありがとうございます。まだ修正はなく、次のリリースで修正する予定はありませんが、将来のリリースで検討する予定です。再度、感謝します。マーク・ペイン

于 2012-11-12T21:20:43.090 に答える