Jaký je nejlepší způsob, jak k inicializaci pole na pole s pevnou délkou? (C ++ / CLI)

hlasů
2

V spravované C ++ / CLI, mohl bych to buď jako (1):

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

nebo (2):

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

Ale já zřejmě nemůže dělat (3):

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

i když se dá dělat (4):

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

Existuje lepší způsob, jak mi chybí? Já bych chtěl mít jednoduchý / čistý způsob, jak psát somethiing takto:

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

Dík!

Položena 29/01/2009 v 20:32
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
2

Musíte se liší inicializace a přiřazování. Je to jako Tobias Warre řekl ve svém příspěvku. Nemůžete (3) dělat, protože assingnment nepracuje s inicializace závorkách . (4) funguje, protože jste ardinarly přiřadit nové hodnoty do svého pole. Ve skutečnosti by měl fungovat takto:

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;
    }
}

Tímto způsobem přiřazené hodnoty jsou zkopírovány do pole.

EDIT: Bohužel neexistuje žádný swapzpůsob jako u STL kontejnerů (alespoň nikdo vím), jinak byste mohli jen prohodit obsah se dočasný.

Odpovězeno 30/09/2009 v 10:15
zdroj uživatelem

hlasů
1

Měli byste být schopni přeskočit parametr velikosti při alokaci pole s agregační inicializátor. Například následující kód kompiluje pro mě:

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

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

};

Váš příklad (3) nefunguje, protože gcnew array<type>je nutné.

Odpovězeno 06/05/2009 v 15:44
zdroj uživatelem

hlasů
0

Myslím, že nevíte jak dál s (2).

V C99, můžete skutečně používat složené literals dělat (3), ale nevím, jestli je něco takového v C ++ / CLI. Nebylo by to pomoci s problémem, tak jako tak: za použití sloučeniny doslovný v těle funkce by stack-, ne haldy přidělit pole.

Pro haldy přidělení po inicializaci, není Pokud vím žádný způsob, jak obejít new, gcnew, malloc()...

Odpovězeno 29/01/2009 v 21:18
zdroj uživatelem

hlasů
0

Vypadá to, že pokud chcete, aby inicializaci pole podobného

(array = {elem1, elem2,etc})

musíte to udělat v prohlášení. Toto prohlášení by také mít pouze lokální dosah, tedy nelze bezpečně používat paměti při odchodu z funkce, která deklaruje pole, v tomto případě je třeba přidělit paměť pomocí nové. Ve druhém případě, nezapomeňte smazat objekt, když už není potřeba aplikací.

Takže 1, pokud ji potřebují pouze lokálně nebo při volání funkce z této specifické funkce a 2, pokud ji budete potřebovat jinde, když je funkce ukončen.

Odpovězeno 29/01/2009 v 20:39
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more