从函数返回字符串(VAX PASCAL)
这是一个软件考古学家 在你问我为什么要费心让它发挥作用之前,原因很简单,因为我可以——我认为这是一个很好的借口 我发现以下过程代码使用VAX PASCAL编译(并按预期运行) 但是,如果将其转换为函数并尝试以字符串形式返回结果,则不会编译从函数返回字符串(VAX PASCAL),pascal,vax,Pascal,Vax,这是一个软件考古学家 在你问我为什么要费心让它发挥作用之前,原因很简单,因为我可以——我认为这是一个很好的借口 我发现以下过程代码使用VAX PASCAL编译(并按预期运行) 但是,如果将其转换为函数并尝试以字符串形式返回结果,则不会编译 FUNCTION format(number : INTEGER) : STRING(16); VAR result : STRING(16); BEGIN : : format := result;
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]编码>并定义函数格式(编号:整数):String16我想了想,但这看起来太奇怪了!我会让你知道它是否有效。@LURD建议的也是你在Delphi中需要做的事情(可能是目前使用最广泛的Pascal)。我认为类型声明的必要性在于,当编译器在函数声明中遇到类型定义时,类型定义已经存在于其符号表中,因此(至少在Delphi中),调用函数时使用的参数可以通过类型检查,“result”是一个预定义变量,可以在函数中使用它,而不是在函数名中使用它(如在标准Pascal中)。这很可能就是这里的问题所在-尝试为变量使用不同的名称。@LU RD-wird结果很好!这就像指责C++是一个弱的预处理器,C哦不,这是比大多数连续引用Pascal批评的十五到十五年。
FUNCTION format(number : INTEGER) : String16;
VAR
result : String16;
BEGIN
:
:
format := result;
END.