Pregunta

Aquí hay una función similar a la que he definido:

void Function( BYTE *data );

Lo que me gustaría hacer es algo como esto:

Function( new BYTE { 0x00, 0x00 } );
¿Fue útil?

Solución

No puede usar la sintaxis de inicializador de matriz con matrices asignadas dinámicamente usando new . Podrías hacer algo como esto:

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

¿Pero por qué estás usando memoria asignada dinámicamente aquí? ¿La matriz se mantiene fuera del alcance de la función actual? Si no, puede usar una matriz asignada en la pila:

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

En C ++, un método preferido es usar la clase STL std :: vector que actúa como una matriz asignada dinámicamente (pero segura):

std::vector<BYTE> ary(2);
Function(&ary[0]);

Otros consejos

BYTE foo[] = { 0x00, 0x00 };
Function( foo );

C ++ 0x introducirá la sintaxis de la lista de inicializadores que permitirá algo más cercano a lo que deseaba anteriormente.

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

Lo anterior funciona si todo lo que siempre quiso fue inicializar la matriz BYTE a todos los ceros. (Supongo que este es el tipo BYTE de Windows). Sin embargo, esto es propenso a fugas como se mencionó y es mejor evitarlo.

O podría usar los puntos suspensivos para imitar la construcción de su matriz:

mire esto: http://www.cplusplus.com/ referencia / clibrary / cstdarg / va_arg /

Y si realmente quiere jugar antes de que llegue el 0x, eche un vistazo a este código .

gcc tiene una extensión llamada " Literales compuestos " ;, que le permite escribir:

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

Tenga en cuenta que está asignado en la pila, por lo que podría no ser adecuado para sus propósitos.

Bueno, si BYTE es una clase, podría tener un constructor

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

y luego llame

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

Sin embargo, esto es propenso a fugas. Debe eliminar el argumento antes de salir de Function. Y eso no siempre es posible (por ejemplo, si no tiene la fuente de Function)

Función auxiliar;

  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;

Recuerde, las matrices creadas con new [] se eliminan con delete [] ;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top