Архив метки: ASTRING

Некоторые особенности при работе с BSTRING и ASTRING #3

YF> А поподробнее про этот тип данных можно?  В частности, можно ли писать Use(Bstring)? Например, Use(Astring) в CW5 не работало, а в CW55 вроде работает….

Да про нее и писать-то особенно нечего!

Данный тип автоматически преобразует записанные в него данные согласно универсальной символьной таблице, когда на каждый символ выделяется два байта.

Т.е.,если делаем присвоение, например, BStr = ‘12345’, то в памяти эта строка будет храниться как ‘1<0>2<0>3<0>4<0>5<0>’. Национальные символы будут преобразованы в соответствующие им двухбайтовые последовательности. Для программы это все делается прозрачно. Этот тип позволяет нормально работать с API-функциями, которые в качестве строковых параметров требуют строки такого формата. Раньше для этого приходилось формировать такие строки вручную.

В отличии от ASTRING, выделенная память для BSTRING никак Кларионом не учитывается. Это обстоятельство, кстати, уменьшает накладные расходы памяти для BSTRING до 4 байт, которые стоят непосредственно перед строкой и содержат длину данной строки (с учетом 2байта/символ).

А что касается USE, я так и не понял, что у тебя не работало в C5? У меня в тестовом примере на C5eeb нормально работает окно с двумя строковыми полями для ввода — ASTRING и BSTRING.

Некоторые особенности при работе с BSTRING и ASTRING #2

AN>     Я, может и щас глупость скажу, но ИМХО сей ASTRING есть ни что иное, как виндовый атом и такое поведение для него вполне естественно, т.е. при создании строки RTL лезет в таблицу атомов, ежели там такой нет, то добавляет, если есть, то увеличивает счетчик обращений к этой строке и возвращает уже ея.  При удалении строка физически удаляется из таблицы только ежели счетчик равен 0. (ну прям как FileManager в ABC с откр/закр фалов :)).

Так, ASTRING именно так и заявлена разработчиками. Как аналог атома. Я с виндовыми атомами не разбирался, но, исходя из твоего описания, могу сказать, что ASTRING несколько отличается от атома:

  • у ASTRING нет счетчика
  • она физически удаляется ТОЛЬКО при завершении программы.

Кстати, на каждую ASTRING уходит, как минимум, от 14 до 22 байт доп. памяти.

Некоторые особенности при работе с BSTRING и ASTRING

Думаю всем будет полезно узнать, что при использовании типа BSTRING в группах/очередях/классах надо запомнить следующее правило:

  • если группа/очередь/класс объявлены в глобальных данных, то в конце программы надо ОБЯЗАТЕЛЬНО ставить Clear(GROUP/CLASS). В случае использования очереди надо ОБЯЗАТЕЛЬНО пройтись по каждой записи и или очистить ее всю или сделать Clear() полям BSTRING.
  • если группа/очередь/класс объявлены как локальные для процедуры, то в конце процедуры надо выполнить аналогичные действия как и для глобальной.

В случае использования BSTRING в очередях Читать далее