Вопрос о том, как скопировать массив байтов, буферизует к указателю байта в Visual C++

Я отправляю свой первый вопрос, здесь просмотрев много полезных обменов другими; это очень захватывающе! Я думаю, что этот вопрос будет довольно прост для ответа, но я надеюсь, что кто-то может пролить некоторый свет на него начиная с того, что это досаждало мне.

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

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
задан meagar 10 August 2010 в 13:46
поделиться

1 ответ

Здесь есть два пути.

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. варианты.

2
ответ дан 2 September 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: