Как получить первые x элементов массива char в C? Есть ли улучшенный способ с boost-библиотеками?

Моя основная задача — получить подмножество буферного массива в другой буферный массив:

char buffer[max_len];

unit8 *pDestBuffer;

Я использовал этот код, потому что я хотел бы остаться в ANSI-C:

memcpy(pDestBuffer, buffer, 4);

Однако — что-то должно быть не так, потому что я не получаю свой результат, как я ожидаю. Потому что, когда я отлаживаю буфер, я вижу все игровые автоматы массива — когда я делаю это с pDestBuffer, я получаю только один элемент — который я могу изменить, однако, с чем-то вроде memset(pDestBuffer,1,4)

pDestBuffer является частью структуры, и единственной другой ссылкой на него, кроме определения выше, были следующие строки:

requiredMemory = sizeof(Structure) + bufferSize;
pStructure = (Structure *)HostMalloc(requiredMemory);
pStructure->pDestBuffer = ((uint8 *)pStructure)+sizeof(Sturcture);

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

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

1

Решение

Ваш код работает. Тот факт, что ваш отладчик не может видеть данные, не означает, что их там нет. Происходит то, что ваш код говорит uint8_t * pDestbuffer; поэтому ваш отладчик думает, что pDestBuffer — это просто указатель на один байт, вот что он показывает. Однако вы знаете, что это на самом деле указатель на массив.

Может быть какой-то способ сообщить отладчику, что это массив, чтобы вы могли видеть все данные. Например, один отладчик, которого я знаю, позволит вам ввести pStructure->pDestBuffer,4 сказать, покажи мне четыре байта, а не один.

4

Другие решения

Я думаю, что «лучшая практика» — не смешивать код C ++ и C.

#include <array>
#include <vector>
#include <algorithm>

std::array<char, len> buffer;
std::size_t n = 5;
std::vector<char> dest; // if n is dynamic
dest.reserve(n); // "performance"std::copy(begin(buffer), buffer + n, std::back_inserter(dest));

// or even shorter
std::vector<char> dest{begin(buffer), buffer + n};
2

буст библиотеки это C ++. Это C или C ++?

Вы говорите C в заголовке, и ваш код — C, но C ++ — это действительно другой язык, с другим стилем написания.

Что вы подразумеваете под «увидеть все слоты»? Если вы имеете в виду Microsoft IDE, то, что вы назвали unit8 *, что вы, вероятно, имеете в виду uint8_t * или подобный, является указателем, и он может интерпретировать его как строку с нулевым символом в конце, но, скорее всего, просто указатель (из-за его знака) и показывает, на что он указывает, а не начало массива.

1
По вопросам рекламы [email protected]