Перемещая переменную в вектор, значение в этой точке вектора изменяется, когда переменная - PullRequest
1 голос
/ 15 января 2011

У меня проблема с программированием =)

 std::vector<char*> Names;

if(MyPacket.ID == 3) {Names.push_back(MyPacket.Buffer);}

Я помещаю полученный буфер в вектор следующим образом, но при изменении буфера изменяется значение переменной в этой точке вектора.

Так, скажем, я послал и поместил буфер, содержащий 'Simon', на вектор, что было бы хорошо, поэтому в точке [0] на векторе будет слово Simon.

но затем, когда я получаю новый буфер, он перезаписывает позицию [0], хотя идентификатор пакета отличается, точка останова в операторе if не достигается с этим новым буфером.

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

Любая помощь приветствуется

Дэвид Эндрюс

Ответы [ 3 ]

4 голосов
/ 15 января 2011

Вы нажимаете указатель на некоторые символы в памяти, если область, на которую указывает этот указатель, изменится, вы увидите измененное значение. Если вы хотите скопировать значение буфера, вы можете использовать вектор std :: string вместо вектора char *.

Например:

std::vector<std::string> Names;

if(MyPacket.ID == 3) {Names.push_back(MyPacket.Buffer);}

, если буфер содержит строку с нулевым символом в конце. Если нет, вам нужно откуда-нибудь получить длину буфера и создать строку из буфера в буфер + len.

0 голосов
/ 15 января 2011
std::vector<char*> Names;

Нет, нет, нет, нет, НЕТ! Просто сказать нет! Все ваши проблемы и многое другое прямо в этом маленьком объявлении переменной. Позвольте мне исправить это для вас:

std::vector<std::string> Names;

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

0 голосов
/ 15 января 2011

char * = адрес, указывающий на символ.

Я предполагаю, что MyPackey.Buffer также является символом *.

Если это так, то вы помещаете адрес буфера на вектор, поэтомуи Buffer, и Names [0] имеют одинаковое значение (например, [0x10223943]).

Вам необходимо сделать memcopy или что-то в этом роде, чтобы скопировать значения по адресу памяти MyPacket.Buffer в новую память и затем использовать это.

Простой пример http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

Надеюсь, это поможет.

...