2012-02-27 20 views
5

Chcę, aby moja funkcja zwróciła tablicę BYTE. Ta funkcja jest następująca.Funkcja zwraca tablicę 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]; 
} 

To nie zwraca tablicę bajtów i kiedy zmienić BYTE do BYTE[] lub BYTE[3] wyskakuje mi błąd.

Odpowiedz

9

return bufDataIn[3]; oznacza „powrót 4th elementem bufDataIn tablicy”, a w tym przypadku prowadzi do nieokreślonego zachowania, ponieważ rozmiar tablicy jest 3.

można przydzielić pamięci dla tej nowej tablicy w ciele swojej funkcji i powrócić wskaźnik do jej pierwszego elementu:

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

nie zapomnij delete go, gdy skończysz z nim:

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

Jeszcze lepiej, użyj std::vector<BYTE> i pozbądź się tego brzydkiego zarządzania pamięcią;) Zapewnia to, że pamięć jest poprawnie zwalniana na każdej ścieżce powrotnej, nawet gdy są zgłaszane wyjątki.

+0

Proszę zamień "powinieneś" z "możesz" ... bardzo dobrą ogólną odpowiedzią. +1 –

+0

@BenVoigt: Naprawiono. Dziękuję Ci. – LihO

3

Ponieważ twoja macierz jest stosunkowo mała, zaleciłbym przekazanie bufora jako argumentu funkcji.

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

Teraz będzie użyć tej funkcji w następujący sposób:

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

ten sposób można uniknąć wykorzystania dynamicznej alokacji pamięci i uczynić Twój kod bezpieczniejsze.