Возвращение строки из функции (VAX PASCAL) - PullRequest
1 голос
/ 19 февраля 2020

Это одна из программных археологов!

И прежде чем вы спросите, почему я вообще пытался заставить это работать, причина в том, что я просто могу - что я думаю, это очень хорошее оправдание!

Я обнаружил, что следующий код для процедуры компилируется с использованием 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, но они тоже не работают. К сожалению, я не могу найти пример функции, которая возвращает STRING в SYS $ EXAMPLES или в руководствах, которые я нашел для битсейверов.

Надеюсь, у кого-то память лучше, чем у меня.

Спасибо

1 Ответ

2 голосов
/ 19 февраля 2020

"Система типов Pascal была описана как" слишком сильная ", поскольку размер массива или строки является частью его типа, ..." Сильная и слабая типизация

Это подсказывает, что String(16) в возвращаемом значении функции слишком расплывчато для компилятора.

Исправьте это, объявив строковый тип который подходит компилятору:

type 
  String16 = packed array[1..16] of char;

Тогда вы можете использовать этот отдельный тип в функции:

FUNCTION format(number : INTEGER) : String16;
VAR
  result : String16;
BEGIN
  :
  :
  format := result;
END.

Это очень много, что использовалось во многих ранних реализациях pascal язык (и Turbo Pascal), и все еще действует. Современные компиляторы, такие как Delphi и Free Pascal, реализовали специализированный динамический массив c для строк, который охватывает более удобную обработку типа строки, не зависящую от объявления строгого размера.

...