Вопрос о том, как скопировать буфер байтового массива в байтовый указатель в Visual C ++ - PullRequest
1 голос
/ 10 августа 2010

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

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

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 Ответ

2 голосов
/ 10 августа 2010

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

1) Вы выделяете новый буфер и заполняете его байтами.Для этого вам нужно изменить свою функцию так, чтобы она принимала двойной указатель, подобный этому:

int CFlirPumpDlg::ScanAndShift(BYTE **pPacketbuf)

Но затем вы должны выделить новый буфер вместо его объявления.Примерно так:

BYTE* tempGpsInputBuf = malloc(...);

И вы должны изменить это:

pPacketbuf = (BYTE *)&tempGpsInputBuf;

На это:

pPacketbuf = tempGpsInputBuf;

Также все, что вы индексируете в pPacketbuf, должнысделать это так:

*pPacketbuf[index]

И вам нужно подумать об освобождении «старого» буфера.

2) Вы можете скопировать байты из tempGpsInputBuf обратно в pPacketbuf с помощьюa memcpy.

Или вы можете перейти с 3. опцией, то есть изменить свой алгоритм, чтобы выполнять всю работу в pPacketbuf.Я не знаю, возможно ли это или нет.

Лично я бы выбрал варианты 2. или 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...