![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| CyberDemon |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.10.2003 Где: Нижний Новгород Репутация: нет Всего: нет |
У меня просто фокусы в таком коде:
В общем, все чудеса происходят в цикле функции IncodingToUnicode. Сначала все хорошо присваивается, потом, в цикле 3-4 на присваивании cDataOut[(i*4)+1] = cTemp[1] происходят чудеса. символ то присваивается, в вот в cDataOut, после символа в памяти возникает всякая белебердистика. Причем, эта белебирдистика не мешает дальнейшему прохождению цикла, и он выполнятся дальше. Просто откуда этот мусор берется? Это сообщение отредактировал(а) CyberDemon - 5.8.2008, 14:53 |
||||||
|
|||||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
sprintf - работает с си-строкой, т.е. в конец добавляется "\0" |
|||
|
||||
| CyberDemon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.10.2003 Где: Нижний Новгород Репутация: нет Всего: нет |
Пробовал, не помогает. При этом и так работает, правда до определенного момента :( |
|||
|
||||
| Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: 3 Всего: 7 |
Как ты его видишь ? Через дебаггер ? Не очень понятно, в чем проблема. Если ты присваивашь Си строке значение 0, это озночает конец для нее. --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Мусор там изначально, после new байты никак не инициализируются. Просто отладчик показывает буфер как строку (т.е. до первого нуля). В какой-то момент ты этот 0 заменяешь, и строка становится длинней. Не хочешь на это смотреть - обнули буфер заранее. НО это не страшно. Другое дело, что в IncodingToUnicode нужно действительно 5 символов выделять, иначе возможны наезды на память, особенно в релизе. Кроме того, зачем такую ерунду как 5 символов выделять динамически? Выдели в стеке буфер символов в 10, на всякий случай...
И мне не совсем понятно, как ты выделяешь память для выходного сообщения: если ты генеришь шестнадцатеричное представление входной строки в Unicode, то длина должна быть len*4 + 1. И еще, проще сразу заполнить выходной буфер нулями, потом копировать туда по 4 байта cTemp с помощью memcpy, потом заменить все пробелы на '0'... а то монстр получился из ерундовой функции... -------------------- ... |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
CyberDemon,
ось какая? unicode это же 16 бит, а у тебя 4 байта |
|||
|
||||
| CyberDemon |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.10.2003 Где: Нижний Новгород Репутация: нет Всего: нет |
По порядку:
Естесвенно черз дебагер. Выполняем тело цикла. Первое присвоение cDataOut = "A\0\0\0\0", второе cDataOut = "A8\0\0\0", а после третьего, которое по идии не должно нули менять в конце cDataOut = "A8E>>>>?MMMM?>>>>". Вот почему это так?
Для этого там и стоит memset(cTemp, 0, 4);
Просто эксперементировал почему так. Изначально было в стеке. Сейчас переведу обратно. На счет [10], взял на заметку. Поэксперементирую-расскажу. Кстати да, если выделять 4, то при выходи из функии, если переменная объявлена как в стеке, вываливается ошибка, что простанство вокруг переменной искажено.... Знаем...
WinXP. Мне просто надo код из Unicode в char перевести. Уверен, что уже есть такая функция, но коль уже написал таблицу кодов, жаль работу губить... |
||||||||
|
|||||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: 3 Всего: 7 |
CyberDemon,
Подобные вещи всегда лучше делать в отдельных тестовых проектах, а затем интегрировать в настоящий проект. Советую тебе так сделать - навярника при создании тестового примера, все и найдешь сам. Без тестового кода тут трудно разобратся, если ошибки, которые могут проевлятся гораздо раньше, чем видишь их последствия. У тебя может даже в функции EncodingToUnicode ошибка, а где-то в другом месте. --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
| CyberDemon |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 11.10.2003 Где: Нижний Новгород Репутация: нет Всего: нет |
В общем так не до чего и не докопался. Сделал тупым, но надежным способом:
В общем-то пускай так будет, все равно даже с этой проблемой все работает, а так, и глаза не будет мусор мозолить, и если сделать strlen, все будет правильно. В общем, работать то работает, и работает как надо, но все же хотелось бы знать, от куда вдруг мусор в cDataOut появляется, если и cDataOut и cTemp в начале зануляются полностью.....
В общем-то я примерно так и делаю. Это тестовый проек, в котором испытывается оновной функционал, а уже потом, если испытания пройдут удачно, из тестового он перерастет в настоящий. P.S. По совету Earnest сделал char cTemp[10];. Т.е. увеличел иазмер и вернул в стек. Это сообщение отредактировал(а) CyberDemon - 5.8.2008, 20:55 |
||||
|
|||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Функция просто афигеть
|
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Шутник... мусор-то у тебя в выходном буфере, куда ты по символу складываешь... -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |