Вставляя переменную в вектор, значение в этой точке вектора изменяется, когда изменяется переменная.

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

 std::vector<char*> Names;

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

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

Итак, скажем, я отправил и поместил буфер, содержащий «Саймон», в вектор, который был бы в порядке, поэтому в точке [0] на векторе было бы слово «Саймон».

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

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

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

Дэвид Эндрюс


person David Andrews    schedule 15.01.2011    source источник


Ответы (3)


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

Например:

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

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

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

person Mic    schedule 15.01.2011

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

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

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

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

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

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

person Vinnyq12    schedule 15.01.2011

std::vector<char*> Names;

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

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

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

person Edward Strange    schedule 15.01.2011
comment
Я сказал им, что в моем родном городе установлен памятник вам. Благодарю вас. - person David Andrews; 15.01.2011