Возврат строки из функции (VAX PASCAL)
Это для археологов-программистов!
И прежде чем вы спросите, почему я вообще пытался заставить это работать, причина в том, что это просто потому, что я могу - что я считаю прекрасным оправданием!
Я обнаружил, что следующий код процедуры компилируется с использованием VAX PASCAL (и работает, как ожидалось).
PROCEDURE format(number : INTEGER);
VAR
result : STRING(16);
BEGIN
:
:
writeln(result);
END.
Однако, если превратить это в функцию и попытаться вернуть результат в виде строки, он не будет компилироваться.
FUNCTION format(number : INTEGER) : STRING(16);
VAR
result : STRING(16);
BEGIN
:
:
format := result;
END.
Ошибка предполагает, что ошибка связана с определением типа функции.
FUNCTION format(number : INTEGER) : STRING(16);
1
PASCAL-E-TYPCNTDISCR, Type can not be discriminated in this context
Я пробовал использовать типы VARYING и ARRAY вместо STRING, но они тоже не работают. К сожалению, я не могу найти пример функции, которая возвращает СТРОКУ в SYS$EXAMPLES или в найденных мною руководствах по битсайверам.
Надеюсь, у кого-то память лучше, чем у меня.
Благодарность
1 ответ
"Система типов Паскаля была описана как" слишком сильная ", потому что размер массива или строки является частью ее типа..." Сильная и слабая типизация
Это намекает на то, что String(16)
в функции возвращаемое значение слишком расплывчато для компилятора.
Исправьте это, объявив строковый тип, подходящий для компилятора:
type
String16 = packed array[1..16] of char;
Затем вы можете использовать этот отдельный тип в функции:
FUNCTION format(number : INTEGER) : String16;
VAR
result : String16;
BEGIN
:
:
format := result;
END.
Это очень похоже на то, что использовалось во многих ранних реализациях языка паскаль (и Turbo Pascal), и до сих пор действует. Современные компиляторы, такие как Delphi и FreePascal, реализовали специализированный динамический массив для строк, который обеспечивает более удобную обработку строкового типа, независимо от объявления строгого размера.