2

マネージ C++/CLI では、(1) のようにこれを行うことができます。

array<System::Byte>^ css_keycode = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};

または (2):

array<System::Byte>^ css_keycode;
css_keycode  = gcnew array<System::Byte>(6) {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};

しかし、私は明らかにできません(3):

array<System::Byte>^ css_keycode;
css_keycode  = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};

私はできますが(4):

array<System::Byte>^ css_keycode = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
array<System::Byte>^ css_keycode_shadow;
css_keycode_shadow = css_keycode;

私が行方不明になっているより良い方法はありますか?次のようなものを書くためのシンプルでクリーンな方法が欲しいです:

public ref class decoder {
    array<System::Byte>^ css_keycode;
   ...
    decoder(void) {
        css_keycode = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
    }
}

ありがとう!

4

4 に答える 4

2

初期化と割り当てを区別する必要があります。TobiasWärreが彼の投稿で言ったようです。割り当ては初期化ブラケットでは機能しないため、(3)を実行することはできません。(4)は、配列に新しい値を熱心に割り当てるため、機能します。実際には、次のように機能するはずです。

public ref class decoder {
    array<System::Byte>^ css_keycode;
   ...
    decoder(void) {
        array<System::Byte>^ css_keycode_tmp = {0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
        css_keycode = css_keycode_tmp;
    }
}

このようにして、割り当てられた値が配列にコピーされます。

編集: 残念ながらswap、STLコンテナのような方法はありません(少なくとも私が知っているものはありません)。そうでなければ、コンテンツを一時的なものと交換することができます。

于 2009-09-30T09:15:00.410 に答える
1

集約初期化子を使用して配列を割り当てるときに、サイズ パラメーターをスキップできるはずです。たとえば、次のコードはコンパイルされます。

public ref class TestIt
{
public:
   TestIt()
   {
      mArray = gcnew cli::array<System::Byte>{0x51, 0x67, 0x67, 0xc5, 0xe0, 0x00};
   }

private:
   cli::array<System::Byte>^ mArray;

};

が必要なため、例(3)は機能しませんgcnew array<type>

于 2009-05-06T14:44:59.227 に答える
0

そのような配列を初期化したい場合のようです

(array = {elem1, elem2,etc})

宣言時に行う必要があります。また、宣言にはローカルスコープしかありません。つまり、配列を宣言する関数を終了するときにメモリを安全に使用することはできません。その場合、new を使用してメモリを割り当てる必要があります。後者の場合、アプリケーションで不要になったオブジェクトを削除することを忘れないでください。

したがって、ローカルまたはその特定の関数からの関数呼び出し中にのみ必要な場合は 1、関数が終了したときに他の場所で必要な場合は 2 です。

于 2009-01-29T19:39:24.600 に答える
0

(2)で困っていると思います。

C99では、実際に複合リテラルを使用して(3)を行うことができましたが、C++/CLIでこのようなことがあるかどうかはわかりません。とにかく、問題の解決にはなりません。関数の本体で複合リテラルを使用すると、配列がヒープではなくスタックに割り当てられます。

初期化後のヒープ割り当てについては、回避策がありませnewん..gcnewmalloc()

于 2009-01-29T20:18:11.497 に答える