2012-02-27 42 views
5

Tôi muốn hàm của tôi trả về mảng BYTE. Chức năng như sau.Chức năng trả về mảng 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]; 
} 

Nó không trả về một mảng byte và khi tôi thay đổi BYTE để BYTE[] hay BYTE[3] nó mang lại cho tôi một lỗi.

Trả lời

9

return bufDataIn[3]; có nghĩa là "trở về yếu tố thứ 4 của bufDataIn mảng" và trong trường hợp này nó dẫn đến hành vi undefined vì kích thước của mảng này là 3.

Bạn có thể phân bổ bộ nhớ cho mảng mới này trong cơ thể của chức năng của bạn và trả lại con trỏ đến phần tử đầu tiên của nó:

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

Đừng quên delete nó khi bạn hoàn thành với nó:

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

Thậm chí tốt hơn, hãy sử dụng std::vector<BYTE> và loại bỏ khả năng quản lý bộ nhớ xấu xí này;) Điều này đảm bảo rằng bộ nhớ được giải phóng đúng cách trên bất kỳ đường dẫn trả lại nào, ngay cả khi ngoại lệ được ném.

+0

Hãy trao đổi "bạn nên" với "bạn có thể" ... câu trả lời rất tốt tổng thể. +1 –

+0

@BenVoigt: Đã sửa lỗi. Cảm ơn bạn. – LihO

3

Vì mảng của bạn tương đối nhỏ nên tôi khuyên bạn nên chuyển bộ đệm của bạn làm đối số hàm.

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

Bây giờ, người ta sẽ sử dụng chức năng này như sau:

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

Bằng cách này bạn có thể tránh sử dụng cấp phát bộ nhớ động và làm cho mã của bạn an toàn hơn.

Các vấn đề liên quan