Если из объявления
void create_filtered_string(std::vector<boost::uint8_t>& in, std::string& out)
убрать ссылочность на in и оставить std::vector<boost::uint8_t> in все проходит ожидаемо — F на конце не входит в итоговую строку.
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, tasko, Вы писали:
T>>Что за особенность поведения такая? U>
U>char *p = new char(len + 1);
U>
U>у вас тут нет проблем?
Вроде нет
+1 символ для завершающего: p[len] = 0;
во втором случае возможен вариант что не будет использован вся выделенная под len+1 элемент память.
согласно описанию конструктора должно быть все хорошо
string ( const char * s );
Content is initialized to a copy of the string formed by the null-terminated character sequence (C string) pointed by s. The length of the caracter sequence is determined by the first occurrence of a null character (as determined by traits.length(s)). This version can be used to initialize a string object using a string literal constant.
Здравствуйте, tasko, Вы писали:
T>Здравствуйте, uzhas, Вы писали:
U>>Здравствуйте, tasko, Вы писали:
T>>>Что за особенность поведения такая? U>>
U>>char *p = new char(len + 1);
U>>
U>>у вас тут нет проблем?
T>Вроде нет
мне кажется, что вы не заметили ошибку http://codepad.org/sDsLwlPt
для аллокации массивов следует использовать операторы new[]/delete[]
не по теме:
и вообще, рекомендую вам не использовать эти низкоуровневые операторы, а воспользоваться
std::string output(len, 0);
for (size_t x = ...)
{
output[x] = ...
}
out = output;
это повысит надежность кода и устойчивость к исключениям (ну или RAII используйте вместо голых указателей)
при выходе за пределы контейнера в дебуге могут ассерты вам помочь
еще можно посмотреть в сторону std::transform
успехов
Здравствуйте, uzhas, Вы писали:
U>набил я ваш код и вот что получил: U>исходный код: U>http://codepad.org/H4vIjlLP U>подфикшенный код: U>http://codepad.org/5nURjSpj U>можете обратить внимание на комментарий, ибо там забытая логика U>успехов
от делать нечего написал свою версию фильтрационной функции http://codepad.org/BeOtcWS2
возможно, вам что-то пригодится
успехов)
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, tasko, Вы писали:
T>>Здравствуйте, uzhas, Вы писали:
U>>>Здравствуйте, tasko, Вы писали:
T>>>>Что за особенность поведения такая? U>>>
U>>>char *p = new char(len + 1);
U>>>
U>>>у вас тут нет проблем?
T>>Вроде нет U>мне кажется, что вы не заметили ошибку U>http://codepad.org/sDsLwlPt U>для аллокации массивов следует использовать операторы new[]/delete[]
спасибо, действительно как-то мимо прошел Ваш намек
ps странно. не мог целый день залогиниться на rsdn... просто не давал зайти не под логином не анонимно.
Здравствуйте, uzhas, Вы писали:
U>набил я ваш код и вот что получил: U>исходный код: U>http://codepad.org/H4vIjlLP U>подфикшенный код: U>http://codepad.org/5nURjSpj U>можете обратить внимание на комментарий, ибо там забытая логика U>успехов
после фикса new[] / delete[] проблема у меня так и осталась.
про забытую логику. она не совсем забытая. обрабатываются только интересующие нас символы.
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, uzhas, Вы писали:
U>>набил я ваш код и вот что получил: U>>исходный код: U>>http://codepad.org/H4vIjlLP U>>подфикшенный код: U>>http://codepad.org/5nURjSpj U>>можете обратить внимание на комментарий, ибо там забытая логика U>>успехов U>от делать нечего написал свою версию фильтрационной функции U>http://codepad.org/BeOtcWS2 U>возможно, вам что-то пригодится U>успехов)
спасибо за шаблон
после небольшой доработки функция приняла вид:
Здравствуйте, tasko, Вы писали:
T>после фикса new[] / delete[] проблема у меня так и осталась.
Проблема в том, длина результирующей строки во втором случае получается меньше, чем len (в условии обрабатываются не все варианты). В данном случае остаётся один "недозаполненный" символ: 515022404977236<мусор>#0, и #0 (признак конца строки) стоит не сразу после окончания нужных данных. Так совпало, что на месте мусора оказалась F (скорее всего с прошлой функции). Поменяй вызовы функций местами — этой F с большой вероятностью там не будет. Решение — считать кол-во использованных символов, и ставить признак конца не p2[len] = 0, а p2[count] = 0.
Здравствуйте, 24, Вы писали:
24>Здравствуйте, tasko, Вы писали:
T>>после фикса new[] / delete[] проблема у меня так и осталась.
24>Проблема в том, длина результирующей строки во втором случае получается меньше, чем len (в условии обрабатываются не все варианты). В данном случае остаётся один "недозаполненный" символ: 515022404977236<мусор>#0, и #0 (признак конца строки) стоит не сразу после окончания нужных данных. Так совпало, что на месте мусора оказалась F (скорее всего с прошлой функции). Поменяй вызовы функций местами — этой F с большой вероятностью там не будет. Решение — считать кол-во использованных символов, и ставить признак конца не p2[len] = 0, а p2[count] = 0.
Спасибо
"на месте мусора оказалась F (скорее всего с прошлой функции)".
Если передавать по сссылке параметры во вторую функцию то такое совпадение происходило.
Если же не по ссылке то происходило копировани вектора, как результат память new выделялась в "другом" месте.