我有一个使用Sun pascal 2.1编译的pascal程序,我现在想用fpc编译它,但遇到了一些麻烦。该程序中使用了重置过程,但是 Sun Pascal 的重置:reset(file,filename),其中 filename 是一个字符串(参见 Sun Pascal 3.0.2 参考手册); FPC复位时: 程序重置( var f:文件; l:长整型 );(http://www.freepascal.org/docs-html/rtl/system/reset.html),所以我得到了“不兼容类型”错误。
就我而言,reset的第二个参数是一个字符数组,是否可以将其更改为reset(file, sizeof(array)),或者我应该选择另一个编译器,例如gpc,在其中我发现了第二个参数重置也是字符串。
替代方案是 Modern Pascal 的 CLI (www.ModernPascal.com)。我编写它是为了将 Apple Pascal 和旧的 Turbo Pascal 迁移到现代平台上。我支持 99% 的旧语法,以及 Web、dBase 等(我通过这种方式将遗留解决方案移植到 Linux、Mac 等)。
将文件变量(≈抽象句柄)与路径名(≈打开时的文件名之一)关联起来的 Borland Pascal 方法是
assign
。
您编写并放入 reset
的包装纸:
procedure reset(var fileDescriptor: text; const accessVia: string);
begin
assign(fileDescriptor, accessVia);
{$push}
{$IOChecks on}
system.reset(fileDescriptor)
{$pop}
end;
编译器指令仅确保如果无法打开文件进行读取,reset
read
操作将会失败无论如何(早期失败,经常失败)原则)。 您需要为您访问的每个
file
类型编写此
,例如:†
type
{ Parameter list cannot contain local data type definition. }
fileOfChar = file of char;
procedure reset(var fileDescriptor: fileOfChar; const accessVia: string);
begin
assign(fileDescriptor, accessVia);
{$push}
{$IOChecks on}
system.reset(fileDescriptor)
{$pop}
end;
如果您仍然打算reset
文件而不将文件变量与新路径名关联,则还必须为常规
reset
插入一个包装器
procedure reset(var fileDescriptor: text);
begin
system.reset(fileDescriptor)
end;
或在调用站点使用完全限定标识符 system.reset
。 否则,FPC 认为您想要调用自定义 SunPascal
reset
并抱怨太少参数。
†:同时可以用 generic
和
specialize
缩写。