2010-02-10 15 views
6
byte test[4]; 
memset(test,0x00,4); 

test[]={0xb4,0xaf,0x98,0x1a}; 

el código anterior me da una expresión primaria esperada antes del símbolo ']'. ¿alguien puede decirme qué pasa con este tipo de tarea?asignación de matriz de bytes

Respuesta

8

Lo que Ben y Chris dicen es.

byte test[4]={0xb4,0xaf,0x98,0x1a}; 

Si desea hacerlo en tiempo de ejecución, puede utilizar memcpy para hacer el trabajo.

byte startState[4]={0xb4,0xaf,0x98,0x1a}; 
byte test[4]; 

memcpy(test, startState, sizeof(test)); 
+0

Esto funciona si el OP quiere tener esos valores inmediatamente, pero no si quiere asignarlos más tarde. Pero +1 –

+0

Ya, buen punto Chris. Gracias. Agregué una técnica para hacer eso. – EvilTeach

+0

básicamente tengo como arreglos de 5 bytes que quería usar selectivamente en base a algunos datos iniciales que analizo. Por lo tanto, estaba pensando en configurar una matriz y luego ponerle valores que nunca cambiarían, supongo que también la pondría, ya que nunca cambiará. – djones2010

14

No se pueden asignar matrices. Solo puede inicializar con las llaves.

Lo más cerca que se puede obtener, si quieres "asignar" más tarde, está declarando otra matriz y la copia que:

const int array_size = 4; 
char a[array_size] = {}; //or {0} in C. 
char b[array_size] = {0xb4,0xaf,0x98,0x1a}; 
std::copy(b, b + array_size, a); 

o el uso de la clase matriz a partir de std :: TR1 o impulso:

#include <tr1/array> 
#include <iostream> 

int main() 
{ 
    std::tr1::array<char, 4> a = {}; 

    std::tr1::array<char, 4> b = {0xb4,0xaf,0x98,0x1a};  
    a = b; //those are assignable 

    for (unsigned i = 0; i != a.size(); ++i) { 
     std::cout << a[i] << '\n'; 
    } 
} 
+0

+1 para la buena edición. – Void

+0

si asigno valores usando copia, ¿habrá problemas de alcance si los utilizo en los límites de una declaración if? lo que quiero hacer es usar una matriz de bytes en todas las funciones, pero tengo otras 4 entradas de bytes. cuando sé cuál quiero usar, copio en la matriz de bytes genérica (iba a poner esta declaración int si). – djones2010

+0

Estarás * copiando * los valores de bytes, así que no hay problema si la matriz fuente tiene una alcance más pequeño. – UncleBens

4

Además de @UncleBens 's respuesta correcta, quiero señalar que este:

byte test[4]; 
memset(test,0x00,4); 

Se puede acortar a:

byte test[4] = { 0 }; 

Esta es la sintaxis de inicialización que está intentando usar. El idioma rellenará espacios no asignados con 0, por lo que no tiene que escribir { 0, 0, 0, 0 } (y para que, si la longitud de su matriz cambia más tarde, no tenga que agregar más).

+0

Que se puede acortar aún más a la prueba de bytes [4] = {} ;, pero también prefiero el {0}. –

+0

@John: puede, pero solo en C++. En C (que es lo que hago predominantemente), debe tener al menos un valor. –

+0

'byte test [4] = {0};' siempre me hizo pensar que lo que estaba en las llaves se asignaba a todos los elementos (como en uno de los constructores 'std :: vector' de C++). –

7

Además de @Chris Lutz 's respuesta correcta:

byte test[]={0xb4,0xaf,0x98,0x1a}; 

Tenga en cuenta que no es necesario especificar explícitamente el tamaño de la matriz en este caso, a menos que desee la longitud del arreglo a ser mayor que el número de elementos entre los corchetes.

Esto solo funciona si está inicializando la matriz cuando se declara. De lo contrario, deberá inicializar cada elemento de la matriz de forma explícita utilizando su técnica favorita (bucle, algoritmo STL, etc.).

+0

También tenga en cuenta que puede determinar automáticamente el tamaño de la matriz con: 'size_t numTestElems = sizeof (test)/sizeof (byte);' –

+2

@Mike - O, como se trata de C++, 'template size_t array_size (T (& n) [N]) {return N; } 'usado como' size_t numTestElems = array_size (test); ' –

+2

@Mike: iría con sizeof (test)/sizeof (test [0]). De esta forma, no tiene que preocuparse por posibles confusiones de tipo. – Void

Cuestiones relacionadas