Возврат строки из функции (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, реализовали специализированный динамический массив для строк, который обеспечивает более удобную обработку строкового типа, независимо от объявления строгого размера.

Другие вопросы по тегам