2012-02-27 17 views
5

Quiero que mi función devuelva una matriz BYTE. La función es la siguiente.La función devuelve matriz BYTE

BYTE sendRecieveData(BYTE control, unsigned int value){ 

//Open connection to LAC 
HANDLE LACOutpipe; 
HANDLE LACInpipe; 
LACOutpipe=openConnection(MP_WRITE); 
LACInpipe=openConnection(MP_READ); 

//declare variables 
BYTE bufDataOut[3]; 
BYTE bufDataIn[3]; 
DWORD bufInProcess; 
DWORD bufOutProcess; 


//sets CONTROL 
bufDataOut[0]=control; 

//sets DATA to be sent to LAC 
BYTE low_byte = 0xff & value; 
BYTE high_byte = value >> 8; 
bufDataOut[1]=low_byte; 
bufDataOut[2]=high_byte; 

MPUSBWrite(LACOutpipe,bufDataOut,3,&bufOutProcess,1000); 
MPUSBRead(LACInpipe,bufDataIn,3,&bufInProcess,1000); 
MPUSBClose(LACOutpipe); 
MPUSBClose(LACInpipe); 

return bufDataIn[3]; 
} 

No devuelve una matriz de bytes y cuando cambio a BYTEBYTE[] o BYTE[3] me da un error.

Respuesta

9

return bufDataIn[3]; significa "retorno cuarto elemento de bufDataIn matriz" y en este caso se lleva a un comportamiento indefinido ya que el tamaño de esta matriz es 3.

Usted puede asignar memoria para esta nueva matriz en el cuerpo de su función y volver puntero a su primer elemento:

BYTE* createArray(...) 
{ 
    BYTE* bufDataOut = new BYTE[3]; 
    .... 
    return bufDataOut; 
} 

no se olvide de delete que cuando termine con ella:

{ 
    BYTE* myArray = createArray(...); 
    ... 
    delete[] myArray; 
} 

Mejor aún, use std::vector<BYTE> y deshágase de esta fea administración de memoria;) Esto garantiza que la memoria se libere correctamente en cualquier ruta de retorno, incluso cuando se lanzan excepciones.

+0

Cambie "debería" con "puede" ... muy buena respuesta en general. +1 –

+0

@BenVoigt: Solucionado. Gracias. – LihO

3

Dado que su matriz es relativamente pequeña, le recomiendo pasar su búfer como un argumento de función.

void sendRecieveData(BYTE control, unsigned int value, BYTE (&buffdataIn)[3]). 

Ahora, se utilizará esta función de la siguiente manera:

BYTE result[3] = {0}; 
sendRecieveData(3, 0, result); 

De esta manera es posible evitar el uso de la asignación de memoria dinámica y hacer que el código más seguro.

Cuestiones relacionadas