2012-02-27 121 views
5

我想我的函數返回一個BYTE數組。功能如下。函數返回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]; 
} 

它不返回一個字節數組,當我改變​​到BYTE[]BYTE[3]它給了我一個錯誤。

回答

9

return bufDataIn[3];意味着「迴歸bufDataIn數組的第4單元」,在這種情況下,它會導致不確定的行爲,因爲這數組的大小爲3

你可以爲這個新的數組中的函數體中分配內存並返回指向它的第一個元素:

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

不要忘了delete它,當你完成它:

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

更好的辦法是使用std::vector<BYTE>,並用它去除這個醜陋的內存管理;)這確保了即使在引發異常時,也可以在任何返回路徑上正確釋放內存。

+0

請將「你應該」換成「你可以」......總體回答非常好。 +1 – 2012-02-27 18:54:45

+0

@BenVoigt:固定。謝謝。 – LihO 2012-02-27 18:56:26

3

由於你的數組相對較小,我建議將緩衝區作爲函數參數傳遞。現在

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

,如下一個將使用此功能:

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

這樣你可以避免動態內存分配的使用情況,使您的代碼更安全。