pascal - Pascal(免费或 Turbo)读取
问题描述
我试图理解fpc -Mtp -vw
在 Linux 下以 Turbo 模式(特别是)编译的 Free Pascal 中出现的一种有点神奇的行为。代码来自 Jack Crenshaw 的“Let's Build a Compiler”,第 IV 部分,特别是带有Input
和Output
过程的最后一个版本,可在http://www.pp4s.co.uk/main/tu-trans-comp-jc-04找到.html。我发现“神奇”的是程序中的Read(Table[GetName]);
一行Input
。根据 FP 文档,“Read
从文件 F 中读取一个或多个值,并将结果存储在 V1、V2 等中;如果未指定文件 F,则读取标准输入。” 在过程Read
中GetChar
,它的行为似乎很像 C getchar()
,即从标准输入缓冲区中检索下一个字符。在里面Input
调用它反而看起来像一个复杂scanf()
的自动跳过空格并将多位数字转换为整数,并消除了对GetNum
函数的需要,如果您使用例如,则不会调用该函数,?i 345
但如果你试试i=345
,如果你在结果的两边留一个空格,就会=
导致解析错误。是否有其他文档可以证实 Free、Turbo 甚至通用 Pascal 的明显多功能性Read
?
解决方案
Pascal 读、写例程很神奇。IOW 它不是某个库中存在的真实函数,但编译器会在运行时生成一系列调用。该系列包括 read、readln、write 和 writeln,以及扩展的 Pascal readstr和writestr,它们是 read 和 write 的“from string”版本。
调用取决于参数的类型,以及它们是否有额外的参数(例如 write 采用 :x 格式化值表示整数和 :x:y 表示实数):
writeln(x:10:5);
在 Free Pascal 中,与 Turbo Pascal 和 Delphi 不同,一些类似 RTTI 的功能也被暴露出来,例如 writeln() 一个 enum 类型的变量,会将 enum 的值打印为标识符(字符串)。
错误处理和格式化在一定程度上受到限制,因此它们的使用随问题的复杂性而变化
至于你的观察,你的 getchar 之类的调用可能读取了一个 char 类型的变量,而另一个函数的类型是不同的。
推荐阅读
- java - Spring Listener Container - 事务管理器 - Spring Retry - 在几个事务中
- python-3.x - 我是 ML 新手,我不明白 sklearn 部分
- linux - 如何设置默认的 xrander 模式
- java - 需要去掉聚合操作里面的三元算子
- json - jq:如何从相同类型的列表中检索元素?
- lua - 在 Lua 中 for...in 是什么意思?
- css - 有没有办法将多个变量连接成一个?
- java - TrueCaller Android SDK 'sdkOptions' 具有私有访问权限
- javascript - 无法将谷歌脚本中的分页符添加到通过 for 循环创建的项目中
- excel - 在 Excel 2016 中使用 Excel VBA 创建数据透视表 - 运行时错误 1004