Хочу обратить внимание на проблему.
Есть в описании языка функция SIZE, возвращающая специфичный для платформы размер типа. Сам я считаю её использование нежелательным. В конце-концов главное её предназначение в работе в связке с SYSTEM, пусть и через посреднические модули. Но выяснилось, что её активно используют в Blackbox для промышленных задач.
Цитата:
Есть какой-то тип - блок протокола, например. Простого протокола, уровня модбаса и т.п.
Код:
TYPE
Header = RECORD
...
END;
Frame = RECORD
...
END;
Мне нужно объявить буфер, способный хранить нужный мне размер.
Код:
VAR buf: ARRAY SIZE(Header) + SIZE(Frame) OF BYTE;
В то же время в сообщении о языке говорится:
Цитата:
SIZE не может применяться в константных выражениях, т.к. его значение зависит от фактической реализации компилятора.
Это означает, что поведение в подобном применением SIZE является неопределённым, с соответствующими последствиями для переносимости (не смеяться, КП можно использовать вне ББ).
Схожая проблема есть с функцией SHORT. Её могут использовать для отсечения старших разрядов, что не останавливается ББ, так как по умолчанию нет проверки диапазона.
В описании языка сказано:
Код:
Имя Тип аргументов Тип результата Функция
SHORT(x) LONGINT INTEGER тождество
Что не может быть выполнено при переполнении диапазона, а значит, в таком случае поведение тоже не определено.
Так как Blackbox теперь в руках сообщества, то, наверно, и Компонентный Паскаль тоже. Желательно сделать одно из двух:
1. Привести Blacbox Component Builder в состояние, в котором по умолчанию неопределённое поведение трактуется как ошибка, требующая исправления для работы приложения.
2. Привести формальное сообщение о языке к согласию с практичным применением чтобы, по крайней мере, можно было понять код, не прибегая к экспериментам с компилятором.
С точки зрения переносимости и безопасности лучше первое.