C ++ - Передача массивов в методы - PullRequest
0 голосов
/ 01 мая 2009

Вот функция, аналогичная той, которую я определил:

void Function( BYTE *data );

Я хотел бы сделать что-то вроде этого:

Function( new BYTE { 0x00, 0x00 } );

Ответы [ 7 ]

6 голосов
/ 01 мая 2009

Нельзя использовать синтаксис инициализатора массива с динамически размещаемыми массивами, используя new. Вы могли бы сделать что-то вроде этого:

BYTE *ary=new BYTE[2];
ary[0] = 0;
ary[1] = 0;
Function(ary);
delete [] ary;

Но почему вы используете динамически распределенную память здесь? Содержится ли массив вне области действия текущей функции? Если нет, вы можете использовать массив, выделенный в стеке:

BYTE ary[2] = {0};
Function(ary);

В C ++ предпочтительным методом является использование класса STL std::vector, который действует как динамически размещаемый (но безопасный для типов) массив:

std::vector<BYTE> ary(2);
Function(&ary[0]);
5 голосов
/ 01 мая 2009
BYTE foo[] = { 0x00, 0x00 };
Function( foo );

C ++ 0x представит синтаксис списка инициализатора, который позволит что-то ближе к тому, что вы хотели выше.

2 голосов
/ 01 мая 2009
#include <windows.h>
#include <iostream>
using namespace std;
void foo(BYTE *d) {
    cout << (int)d[ 0 ] << " " << (int)d[ 1 ] << endl;
}
int main(void) 
{
    foo(new BYTE[ 2 ]());
    return 0;
}

Вышеприведенное сработает, если все, что вы когда-либо хотели, это инициализировать массив BYTE всеми нулями. (Я предполагаю, что это тип Windows BYTE.) Однако, как уже упоминалось, он подвержен утечкам и его лучше избегать.

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

gcc имеет расширение под названием «Составные литералы», которое позволяет писать:

Function((BYTE[]){1, 2, 3, 4});

Обратите внимание, что он расположен в стеке, поэтому он может не подходить для ваших целей.

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

Или вы можете использовать многоточие для имитации конструкции вашего массива:

взгляните на это: http://www.cplusplus.com/reference/clibrary/cstdarg/va_arg/

И если вы действительно хотите поиграть до появления 0x, взгляните на этот код .

0 голосов
/ 01 мая 2009

Вспомогательная функция;

  BYTE* makeNaryByteArray( int n, BYTE exemplar = 0 ) {
    BYTE* r = new BYTE[ n ];
    for( int i = 0 ; i < n ; ++i )
       n[i] = exemplar;
    return r;
  }

  //call them:
  BYTE* myByteArray;
  Function( myByteArray = makeNaryByteArray(2) );

  // done with array:
  delete[] myByteArray;

Запомните, массивы, созданные с помощью new[], удаляются с помощью delete[];

0 голосов
/ 01 мая 2009

Что ж, если BYTE - это класс, у вас может быть конструктор

BYTE::BYTE(char c1,char c2){
 //something here.
}

, а затем позвоните

Function( new BYTE(0X00,0X00))

Однако, это подвержено утечкам. Вы должны удалить аргумент перед выходом из функции. И это не всегда возможно (например, если у вас нет источника функции)

...