Архивы автора: Evgeny Stefanenko


Некоторые особенности при работе с 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 в очередях Читать далее →

DynaView

Заинтересовалось несколько человек. Спасибо! Брошу пример и библиотеку чуть позже. Просто добавил еще пару возможностей. В частности — возможность создания динамической группы на основе уже созданной другой. Что-то типа виртуального LIKE. Так что, как протестирую — сразу брошу.

Хотя, вот с примером — проблема в том, какой сделать пример? Моя тестовая программка для этого не годится — слишком много в ней лишней служебной информации. Так что — принимаются любые предложения. Читать далее →

Некоторые особенности при работе с CLASS`ами

Я думаю многие обрадуются, если я сообщу, что есть возможность работать с любыми переменными любых классов!
Независимо от атрибута Private или Protected!

Особенно это актуально при работе с ABC-шаблонами, чьи классы организованы не самым лучшим образом! Теперь, для доступа к Private-переменным, нет необходимости в модификации исходников.

Все очень просто решается использованием функций What/Who/Where! Читать далее →

Ошибка компилятора С5-55

В очередной раз, «копаясь» во внутренностях Клары, обнаружил довольно неприятную ошибку порождаемую компилятором.

  Map
    MyFunc(),*STRING
  End

Str &STRING

  Code
  Str &= MyFunc()
  if ~(Str &= Null) then Message(Str).
  Return

MyFunc Procedure

  Code
  Return Null

Стандартная, казалось-бы, ситуация.
Есть функция, которая возвращает указатель на строку. Неважно, как она формирует эту строку. Важно (ОЧЕНЬ!!!), что она может вернуть нулевой указатель, если, например, из-за ошибки она не смогла сформировать для возврата нужную строку. И в программе мы всегда можем после вызова данной функции проверить Читать далее →

Некоторые вопросы по внутренней организации структур на базе GROUP

Здравствуйте, Алексей.

Заранее прошу прощения, если мое письмо заставило Вас оторваться от более важных дел!

Сразу оговорюсь — речь идет о версиях Clarion С5/C55.

Разбираясь с внутренней организацией структур типа GROUP/QUEUE/CLASS/FILE обратил внимание на некоторые особенности описания OVER-полей. Это, впрочем, касается только OVER-полей, размер которых МЕНЬШЕ перекрываемой ими структуры. В этом случае поле, следующее за таким OVER-полем, описывается также как OVER-поле.
Причем сдвиг для данного поля задается таким образом, что область перекрытия начинается с точки, равной Address(BaseField)+Size(OverField). Читать далее →

Некоторые особенности работы QUEUE

Не так давно по эхам «пробегало» письмо, в котором автор сетовал на невозможность сортировки очереди по полям типа $STRING.

Это действительно так. Но! Это — не глюк Клариона! Это — особенность внутренней реализации структур, основанных на GROUP.

Дело в том, что структуры на основе GROUP имеют как бы двойной интерфейс доступа к полям.

Первый интерфейс — прямое обращение к полю структуры по его метке, которое обрабатывается компилятором на этапе создания программы. При этом, естественно, компилятору доступна ВСЯ информация по типам переменных. Соответственно этим типам ведется и работа с такими полями. Читать далее →

Внутренняя реализация Клариона #3

СЧ> Я не совсем понял что есть «процедура обработки» и что она не обрабатывает?

«Процедура обработки» для View, как и для QUEUE кстати, это практически тот-же драйвер в терминологии FILE. Т.е. при инициализации обьекта типа View или Queue Кларой создается заголовок для них, строится описание их внутренней структуры и в заголовок записывается адрес точки входа в процедуру  обработки. Для Class, вероятно, так-же. Еще не смотрел. Для всех однотипных конструкций — одна и та-же процедура обработки. Читать далее →

Внутренняя реализация Клариона #2

СЧ> Если выбирать, то второй, как более гибкий.
СЧ> Но лучше и тот и другой.
СЧ> И еще не забудь про JOIN — он более сложен чем описан у тебя.
СЧ> Лично меня сейчас в JOIN особенно интересует возможность
СЧ> включать/отключать INNER на ходу.

Ну JOIN не такой уж и сложный! По крайней мере — внутренне.
А если ты имеешь ввиду большую глубину вложенности или много JOIN на одинаковых уровнях, так это все реализуется как-бы автоматом. Главное — правильно научиться формировать главный и первый уровни View. А это я уже умею!
Что касается INNER — кто мешает управлять им через PROP:Inner?
Или я не правильно понял? И что значит «на ходу»?
Если ты имеешь ввиду — во время выборки, то ничего не получиться!
Все установки для View дают эффект ТОЛЬКО перед Open(View)!
После этого по этим установкам формируется результирующая выборка, которую и читают по Next/Previous. Читать далее →