Функция возвращает массив BYTE - PullRequest
7 голосов
/ 27 февраля 2012

Я хочу, чтобы моя функция возвращала массив 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[] или BYTE[3], он выдает ошибку.

Ответы [ 2 ]

10 голосов
/ 27 февраля 2012

return bufDataIn[3]; означает «вернуть 4-й элемент массива bufDataIn», и в этом случае это приводит к неопределенному поведению, поскольку размер этого массива равен 3.

Вы можете выделить память для этого нового массива втело вашей функции и возврат указателя на ее первый элемент:

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

Не забудьте delete когда закончите с ним:

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

Еще лучше, используйтеstd::vector<BYTE> и избавьтесь от этого уродливого управления памятью с его помощью;) Это гарантирует, что память будет должным образом освобождена на любом пути возврата, даже когда генерируются исключения.

3 голосов
/ 27 февраля 2012

Поскольку ваш массив относительно мал, я бы рекомендовал передать ваш буфер в качестве аргумента функции.

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

Теперь можно использовать эту функцию следующим образом:

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

Таким образом, вы можете избежать использования динамического выделения памяти и сделать свой код более безопасным.

...