Я только начал осваивать BB/CP, и появились вопросы по языку. Простите, если они покажутся дурацкими.
Рассмотрим код:
MODULE TestMod1;
IMPORT StdLog;
PROCEDURE P1(
IN name: ARRAY OF CHAR);
BEGIN
StdLog.Int(LEN(name)); StdLog.Ln;
END P1;
PROCEDURE Do*;
VAR x: ARRAY 10 OF CHAR;
BEGIN
P1(
'abc'+'def');
END Do;
END TestMod1.
Согласно п. 9.2 Сообщения о языке:
Цитата:
There are two kinds of parameters: variable and value parameters.
If a formal parameter is a variable parameter, the corresponding actual parameter must be a designator denoting a variable.
Красным в коде выше выделен формальный параметр name, он относится к виду variable parameters (п. 10.1 Сообщения). Синим выделен фактический параметр, который не является (составным) именем переменной и к тому же имеет несовместимый тип (раздел Parameter compatible приложения А Сообщения).
Тогда почему приведенный выше фрагмент вообще компилируется?
Если заменить красное IN на VAR, выдается логичная ошибка: actual VAR-, IN-, or OUT-parameter is not a variable (122).
Если вообще убрать IN (передавать по значению), код также компилируется, объектный файл имеет другой размер: с IN -- 56 байт, без IN -- 128. В дизассемблер пока не смотрел, но уже понятно, что код другой.
В то же время выдача что с IN, что без IN одинаковая.
Заодно возникает следующий вопрос: я видел в коде BB, что строки принимаются в разных случаях и по значению, и как переменные (IN). В чем отличие и как лучше писать?