1

这是为软件考古学家准备的!

在你问我为什么还要费心尝试让它发挥作用之前,这仅仅是因为我可以——我认为这是一个非常好的借口!

我发现以下程序代码使用 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 或我找到的 bitavers 手册中找不到返回 STRING 的函数示例。

希望有人比我有更好的记忆力。

谢谢

4

1 回答 1

2

“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 和 FreePascal,已经为字符串实现了一个专门的动态数组,它涵盖了对字符串类型的更方便的处理,而不依赖于声明严格的大小。

于 2020-02-19T19:22:56.583 回答