purebasic.info

PureBasic forum
Текущее время: Ср сен 19, 2018 8:25 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пт май 06, 2016 9:30 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Цитата:
Не надоело наступать на одни и те же грабли?

Вопрос же не в том почему не работает, а в том почему такое поведение? :cry:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пт май 06, 2016 11:19 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11255
Благодарил (а): 4 раз.
Поблагодарили: 429 раз.
mestnyi писал(а):
почему такое поведение?
Потому что в коде ошибка.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Ср июн 22, 2016 7:57 pm 
Не в сети
доцент

Зарегистрирован: Вс май 15, 2016 5:08 pm
Сообщений: 55
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Дабы не городить новую тему с таким же названием, спрошу тут.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Define string.s = "Некий проверочный текст, так же содержащий слова и на английском языке. Yeah, this is true =)"
Define len.q = StringByteLength(string.s, #PB_UTF8)
 
 
Define *buffer = AllocateMemory(len.q)
PokeS(*buffer, string.s, len.q, #PB_UTF8 | #PB_String_NoZero)
Debug "'" + string.s + "'"
Debug "Len() is " + Len(string.s)
Debug "StringByteLength() is " + StringByteLength(string.s)
 
Debug ""
string.s = ""
 
string.s = PeekS(*buffer, len.q, #PB_UTF8)
Debug "'" + string.s + "'"
Debug "Len() is " + Len(string.s)
Debug "StringByteLength() is " + StringByteLength(string.s)
 
FreeMemory(*buffer)
 



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

* pb 5.40 lts x86

_________________
Чат по PureBasic в Telegram


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Чт июн 23, 2016 3:54 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Замени StringByteLength(string.s, #PB_Unicode)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Чт июн 23, 2016 9:19 pm 
Не в сети
доцент

Зарегистрирован: Вс май 15, 2016 5:08 pm
Сообщений: 55
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
MrF писал(а):
Замени StringByteLength(string.s, #PB_Unicode)


Не поможет. Проверь сам.

_________________
Чат по PureBasic в Telegram


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Чт июн 23, 2016 9:21 pm 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 31
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Не поможет #PB_Unicode. Тут кони и люди смешались в кучу.

Сначала выделяется буфер в 152 байта (байтовая длина указанной 93-символьной строки в формате UTF-8), заполняется данными, а потом из памяти пытаются прочесть строку длиной 152 символа! Естественно, PeekS тянет из памяти все подряд до первого встретившегося нуля, захватывая в том числе всякий мусор.

А еще интересно узнать, с какой целью был использован тип quad для переменной, хранящей длину строки?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Чт июн 23, 2016 10:06 pm 
Не в сети
доцент

Зарегистрирован: Вс май 15, 2016 5:08 pm
Сообщений: 55
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Квад действительно откуда-то прилетел. Звиняйте.

А вот за "кони-люди" спасибо. Действительно, байты/символы... так бы и не заметил.

_________________
Чат по PureBasic в Telegram


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пт июн 24, 2016 5:29 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
damn писал(а):
Не поможет. Проверь сам.

С чего вдруг не поможет? Специально проверял на 5.40 - все помогает. Если у тебя текст в юникоде, то размер надо высчитывать юникодной строки, аналогично с ascii текстом.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пт июн 24, 2016 7:09 am 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 31
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
С того и не поможет, что в программе допущена логическая ошибка. И надо исправить саму ошибку, а не пытаться подогнать решение под правильный ответ.

Если хочется получить правильный результат, несмотря на ошибку, лучше уж использовать PokeS без флага #PB_String_NoZero, выделив перед этим дополнительное место под завершающий строку нуль.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пт июн 24, 2016 9:44 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
puric писал(а):
С того и не поможет

Покажи мне, где тут мусор?

Изображение


Вложения:
test.PNG [76.46 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Пт июн 24, 2016 9:56 pm 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 31
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Я плохо объяснил? В коде допущена ЛОГИЧЕСКАЯ ОШИБКА. Которую вы предлагаете исправить, пардон, быдлокодом: задать буфер чуть больше, чем нужен при заданных условиях, и уповать на то, что он окажется занят нулями.

Ваш глючный код будет работать лишь до некоторых пор. Окажется, что куча содержит вместо нулей какие-то старые данные, - к строке добавятся какие-то смешные символы. Если с содержимым памяти все нормально, то и тогда оно будет работать, пока байтовая длина строки в Unicode больше, чем длина строки в UTF-8. Unicode (а именно UCS-2) занимает всегда 2 байта, а UTF-8 - от 1 до 4. Попадется строчка с какими-нибудь веселыми символами, так что ее байтовая длина в UTF-8 окажется больше, чем в Unicode, - она будет урезана при ее выводе в конце программы. А то еще можно получить ошибку доступа к памяти. Или ошибки не будет, но PokeS затрет важные данные программы прямо в памяти. Это все запросто может вылезти, если программа вырастет за рамки данного примера. Все это надо учитывать сразу.

Не понимаю, зачем вы упираетесь и отрицаете очевидные вещи.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Сб июн 25, 2016 7:28 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
puric писал(а):
быдлокодом

А, т.е. это я несколько постов выше предлагаю получить количество байт из строки с флагом UTF8, а потом использовать это значение как количество символов при чтении строки без флага #PB_ByteLength и удивляюсь почему в строке мусор? :D

puric писал(а):
Ваш глючный код будет работать лишь до некоторых пор...

Ну во первых, код не мой. А во вторых, я не знаю как там у илитных небыдлокодеров, но я привык очищать память которая не используется. Да и как Poke может записать в защищенный регион памяти без дополнительных манипуляций?
puric писал(а):
пока байтовая длина строки в Unicode больше, чем длина строки в UTF-8

При подсчете количества байт длина полученная StringByteLength(string.s, #PB_Unicode) всегда будет больше или равной. Ты может удивишься, но исходные файлы пурика по дефолту сохраняются в формате UTF8 и на режим юникода это никак не влияет. А еще больше удивишься, когда в отладчике посмотришь как это работает.

puric писал(а):
Не понимаю, зачем вы упираетесь и отрицаете очевидные вещи.

Код:
1
Если кончились аргументы, можно сравнить свой тезис с какой-нибудь общеизвестной истиной («Я прав, это так же очевидно, как и то, что дважды два — четыре»). Если оппонент после этого возразит, то можно будет ткнуть его в то, что он якобы опровергает то, что дважды два — четыре, из чего сделать вывод о его интеллекте и образованности (вернее, об их отсутствии) и, пользуясь этим, признать тезис оппонента чушью


Вода и демагогия :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Сб июн 25, 2016 8:12 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 669
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
MrF писал(а):
илитных

С трудом перевёл это слово на русский.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Сб июн 25, 2016 8:16 am 
Не в сети
доцент

Зарегистрирован: Чт июн 23, 2016 8:15 pm
Сообщений: 31
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
MrF писал(а):
А, т.е. это я несколько постов выше предлагаю получить количество байт из строки с флагом UTF8, а потом использовать это значение как количество символов при чтении строки без флага #PB_ByteLength и удивляюсь почему в строке мусор?

Несколько постов выше человек сделал логическую ошибку, перепутав число символов в строке с ее длиной в памяти. А вы предложили использовать глючный костыль. В строке 93 символа, ее UTF-8 представление - 152 байта, под этот размер и выделяется буфер. Ошибка только в том, что считать пытаются 152 символа, а не 93. Вы же предлагаете: "Чувак! Сделай буфер побольше! Не 152 байта, а 186! После строки в нем будет 34 нуля, они остановят чтение!" Это и есть быдлокод. Ошибки как были, так и остались, а программа ходит на костылях.

MrF писал(а):
Ты может удивишься, но исходные файлы пурика по дефолту сохраняются в формате UTF8 и на режим юникода это никак не влияет.

При чем тут исходные файлы пурика? При чем тут дефолтовая кодировка? В данном конкретном примере строка попадает в программу из исходного файла. В другой программе строка может появиться откуда угодно - из базы данных, из текстового файла - да откуда угодно! И какие там будут символы - да кто ж знает.

MrF писал(а):
Ну во первых, код не мой. А во вторых, я не знаю как там у илитных небыдлокодеров, но я привык очищать память которая не используется.

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

Во-вторых, строку в памяти мы могли получить и без AllocateMemory с очисткой буфера перед операциями с ним. Загрузкой файла в двоичном режиме или из какого-то устройства по сети или через последовательный порт - да мало ли как. Попытка чтения из буфера строки с неверной длиной приведет к непредсказуемым последствиям.

MrF писал(а):
Вода и демагогия

Да, профессор. Вы сейчас заняты демагогией. Адью.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PokeS и PeekS с флагом #PB_UTF8
СообщениеДобавлено: Вс июн 26, 2016 5:57 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
puric писал(а):
Несколько постов выше человек сделал логическую ошибку, перепутав число символов в строке с ее длиной в памяти. А вы предложили использовать глючный костыль. В строке 93 символа, ее UTF-8 представление - 152 байта, под этот размер и выделяется буфер. Ошибка только в том, что считать пытаются 152 символа, а не 93. Вы же предлагаете: "Чувак! Сделай буфер побольше! Не 152 байта, а 186! После строки в нем будет 34 нуля, они остановят чтение!" Это и есть быдлокод. Ошибки как были, так и остались, а программа ходит на костылях.



Ну будет буфер с нулями и что это как то повлияет на строку и программу в дальнейшем?
Нет, ну можно конечно написать процедуру len чтобы считала сколько нужно выделить байт под utf8 из строки ucs-2.
или наоборот для ucs-2 из utf8. :D
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
Define string.s = "Некий проверочный текст, так же содержащий слова и на английском языке. Yeah, this is true =)"
Define buff_size.i = StringByteLength(string.s, #PB_Unicode)
Define len.i=Len(string)
Define *buffer = AllocateMemory(buff_size)
PokeS(*buffer, string, len, #PB_UTF8);работает с количеством символов
 
 
Debug "'" + string+ "'"
Debug "Len() is " + Len
Debug "StringByteLength() is " + buff_size
 
Debug ""
string = ""
 
string = PeekS(*buffer, len, #PB_UTF8)
Debug "'" + string.s + "'"
Debug "Len() is " + Len(string)
Debug "StringByteLength() is " + StringByteLength(string.s)
 
FreeMemory(*buffer)
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB