Я отправляю свой первый вопрос, здесь просмотрев много полезных обменов другими; это очень захватывающе! Я думаю, что этот вопрос будет довольно прост для ответа, но я надеюсь, что кто-то может пролить некоторый свет на него начиная с того, что это досаждало мне.
У меня есть функция, которая признает, что массив байтов передал в как указатель байта, несколько слоев программы ниже. Переменная является членом класса, определенного как
m_GpsInputBuf[GpsInputBuflen];
Рассматриваемая функция получает указатель на тот массив как показано в коде ниже. Функция просто смещает байты в массиве налево, когда контрольная сумма для пакета не проверена, и другой синхронизирующий символ для пакета данных расположен в теле пакета. Все вопросы относительно цели функции в стороне, хотя, точка, которой я интересуюсь, является копированием временного массива к указателю массива байтов параметра.
Копия к pPacketbuf переменной происходит, как я надеялся, но когда функция завершается, pPacketbuf переменная, которая существует на уровне вызова ScanAndShift (), функция незатронута. Это связано с аргументом ScanAndShift () быть копией переменной указателя, я верю, но я слишком близок к проблеме для понимания этого прямо сейчас. Понимание? Код ниже:
int CFlirPumpDlg::ScanAndShift(BYTE *pPacketbuf)
{
int idx3 = 0;
BYTE tempGpsInputBuf[GpsInputBuflen];
for(int idx = 1; idx < GpsInputBuflen; idx++)
{
if(pPacketbuf[idx] == CFlirPumpApp::GPS_Start)
{
idx3 = idx;
for(int idx2 = 0; idx2 < (GpsInputBuflen - idx); idx2++)
{
tempGpsInputBuf[idx2] = pPacketbuf[idx3++];
}
pPacketbuf = (BYTE *)&tempGpsInputBuf;
return (GpsInputBuflen - idx);
}
}
return 0;
}
Здесь есть два пути.
1) Вы выделяете новый буфер и заполняете его байтами. Для этого вам нужно изменить вашу функцию так, чтобы она принимала двойной указатель, например:
int CFlirPumpDlg::ScanAndShift(BYTE **pPacketbuf)
Но тогда вы должны выделить новый буфер вместо того, чтобы объявлять его. Примерно так:
BYTE* tempGpsInputBuf = malloc(...);
И вы должны изменить это:
pPacketbuf = (BYTE *)&tempGpsInputBuf;
На это:
pPacketbuf = tempGpsInputBuf;
Также все, что вы индексируете в pPacketbuf
, нужно делать так:
*pPacketbuf[index]
И вы должны подумать о освобождение «старого» буфера.
2) Вы можете скопировать байты из tempGpsInputBuf
обратно в pPacketbuf
с помощью memcpy
.
Или вы можете выбрать 3. вариант, который заключается в изменении вашего алгоритма для выполнения всей работы в pPacketbuf
. Не знаю, возможно это или нет.
Лично я бы выбрал 2. или 3. варианты.