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

从函数返回字符串(VAX PASCAL),pascal,vax,Pascal,Vax,这是一个软件考古学家 在你问我为什么要费心让它发挥作用之前,原因很简单,因为我可以——我认为这是一个很好的借口 我发现以下过程代码使用VAX PASCAL编译(并按预期运行) 但是,如果将其转换为函数并尝试以字符串形式返回结果,则不会编译 FUNCTION format(number : INTEGER) : STRING(16); VAR result : STRING(16); BEGIN : : format := result;

这是一个软件考古学家

在你问我为什么要费心让它发挥作用之前,原因很简单,因为我可以——我认为这是一个很好的借口

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

但是,如果将其转换为函数并尝试以字符串形式返回结果,则不会编译

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
我尝试使用variable和ARRAY类型代替STRING,但它们也不起作用。不幸的是,我在SYS$EXAMPLES或我找到的Bitsaver手册中找不到返回字符串的函数示例

希望有人的记忆力比我好

谢谢

Pascal的类型系统被描述为“太强”,因为数组或字符串的大小是其类型的一部分

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

从文档中可以看到,声明
type String16=字符的压缩数组[1..16]并定义
函数格式(编号:整数):String16FUNCTION format(number : INTEGER) : String16;
VAR
  result : String16;
BEGIN
  :
  :
  format := result;
END.