Лентяи из SV

Разработчики из SV меня не перестают удивлять!
Они или лентяи, или там вообще планирование  разработок новых версий/исправление ошибок  поставлено «из рук вон плохо».

Начал вот перевод некоторых своих приложений с C50 на C55. И сразу на «H» релиз.
Кстати, что-бы не забыть — после перевода не обнаружил никаких проблем с полями файлов, в именах которых есть символ «_». О чем тут как раз шло обсуждение.

Да и вообще — переход прошел настолько гладко, что даже как-то не посебе:) Так и жду, что где-то  рано или поздно вылезет какая-либо гадость.  Приложения очень большие и практически невозможно их  протестировать за приемлемое время.

Проблема обнаружилась только одна — в одном месте  производится переадресация колонок List-а на разные  поля очереди. И, в связи с тем, что в C55 немного  по другому производится нумерация полей групп/очередей,  то переадресация попала на поля-массивы.

А с такими полями, как и раньше, в C55 БОЛЬШИЕ проблемы!  Как не умели функции WHAT/WHO/WHERE корректно работать  с такими полями, так и не умеют. Что, естественно,  сказывается на работе List-ов.

Ну, да ладно! Речь о другом. Уже не один раз в рассылке обсуждался вопрос о проблемах при работе с рефералами на группы. В частности, о невозможности нормального создания новых экземпляров групп, типа:

MyGrp &= NEW(TInfoGrp)

В качестве решения данной проблемы, например Александр Бирюков предлагал использовать конструкцию типа:

MyGrp &= (NEW(STRING(SIZE(TInfoGrp))))

Но, созданный таким методом, реферал является неполноценным, что довольно существенно ограничивает его использование. О чем уже писалось в данной рассылке.
Так вот, приятная новость!
В C55 релиз «H» появилась-таки возможность создавать нормальные новые экземпляры групп, которые являются полностью полноценными рефералами на группы.

Правда, как можно догадаться из начала этого письма,  не все так хорошо, как хотелось-бы.  Опять-же, как и раньше, создать новый экземпляр  стандартным способом невозможно — не пропустит компилятор.  Но разработчики немного модифицировали как сам компилятор,  так и ядро Клариона.

В компилятор, в частности, ввели правильную обработку  операторов присваивания типа:

MyGrp &= (…)

Если прежние версии просто записывали в первый LONG  реферала MyGrp значение в скобках, то в новом релизе  уже предпринята попытка заполнения ВСЕХ полей реферала,  который для групп, как известно, состоит из 3 LONG-полей.  Но, опять-же, все сделано так, что больше напоминает  попытку латания дыр «на ходу»!
Как я уже упомянул в ядро Клариона, для поддержки  вышеописанного кода, введена новая функция Cla$String2Ref.  Эта функция производит обычный разбор входной строки,  предполагая найти в ней три числа, разделенные символом «:».

Вообщем, суммируя все вышесказанное, предлагаю код функции, которая позволяет создавать новые экземпляры групп.

      Map
        NewGroup(*GROUP _Grp),STRING
      End

TGrp  GROUP
Name    STRING(10)
Code    LONG
Index   LONG
      END

FRec &TGrp

Code
FRec &= (NewGroup(TGrp))

! Получили ПОЛНОЦЕННЫЙ реферал на группу TGrp
! Следует заметить, что в пределах декларации
! реферала FRec этот реферал будет обрабатываться
! компилятором ВСЕГДА как группа типа TGrp,
! независимо от параметра функции NewGroup.
! А вот за пределами видимости этой декларации,
! например в процедурах, в которые этот реферал
! передавался просто как &GROUP, он будет
! обрабатываться именно как группа типа
! параметра функции NewGroup.

Return

NewGroup     PROCEDURE(*GROUP _Grp)

RefInfo      STRING(32)
RefStr       &STRING
RefGrp       GROUP
Ref            &GROUP
               GROUP,OVER(Ref)
Addr             LONG
DefPtr           LONG
Size             SIGNED
               END
             END

Code
RefGrp.Ref &= _Grp
RefStr     &= NEW(STRING(RefGrp.Size))
RefInfo    = Address(RefStr) &':'& Size(RefStr) &':'& RefGrp.DefPtr
RefStr     &= Null
Return(RefInfo)

Кстати, можно не боятся опИсаться, и написать, например:

FRec &= NewGroup(TGrp)

Компилятор просто не пропустит подобную конструкцию.
Больше надо опасатся опИски типа:

FRec = NewGroup(TGrp)

или

FRec = (NewGroup(TGrp))

Вообщем, опять, в который раз, разработчики поленились довести дело до логического завершения!