从函数返回字符串 (VAX PASCAL)

Returning a string from a Function (VAX PASCAL)

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

在你问为什么我什至费心尝试让它工作之前,原因很简单,因为我可以 - 我认为这是一个非常好的借口!

我发现以下程序代码使用 VAX PASCAL 编译(并按预期运行)。

PROCEDURE format(number : INTEGER);
   VAR
      result : STRING(16);
   BEGIN
     :
     :
      writeln(result);
   END.

但是,如果将其转换为函数并尝试 return 将结果作为字符串,则无法编译。

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 或我找到的 bitsaver 手册中找到 return 是 STRING 的函数示例。

希望有人比我记性更好。

谢谢

"Pascal's type system has been described as "too strong", because the size of an array or string is part of its type, ..." Strong and weak typing

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