Каков наилучший способ инициализации массива в массив фиксированной длины? (C ++ / CLI) - PullRequest
2 голосов
/ 29 января 2009

В управляемом 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 ]

2 голосов
/ 30 сентября 2009

Вы должны различаться между инициализацией и назначением. Это как сказал Тобиас Вярре в своем посте. Вы не можете сделать (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;
    }
}

Таким образом, присвоенные значения копируются в ваш массив.

EDIT: К сожалению, нет такого метода swap, как для контейнеров STL (по крайней мере, я не знаю о нем), иначе вы можете просто поменять содержимое на временное.

1 голос
/ 06 мая 2009

Вы должны иметь возможность пропустить параметр размера при выделении массива с помощью агрегатного инициализатора. Например, для меня компилируется следующий код:

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>.

0 голосов
/ 29 января 2009

Я думаю, что вы застряли с (2).

В C99 вы могли бы использовать составные литералы для выполнения (3), но я не знаю, есть ли что-то подобное в C ++ / CLI. В любом случае, это не помогло бы с вашей проблемой: использование составного литерала в теле функции будет выделять массив, а не кучу.

Для выделения кучи после инициализации, нет никаких шансов обойти new, gcnew, malloc(), ...

0 голосов
/ 29 января 2009

Похоже, что если вы хотите инициализировать такой массив

(array = {elem1, elem2,etc})

вам нужно сделать это при объявлении. Объявление также будет иметь только локальную область, то есть вы не можете безопасно использовать память при выходе из функции, которая объявляет массив, в этом случае вам нужно выделить память с помощью new. В последнем случае не забудьте удалить свой объект, когда он больше не нужен приложению.

Так 1, если вам нужно только локально или во время вызова функции из этой конкретной функции и 2, если вам нужно в другом месте, когда функция вышла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...