【问题标题】:FreePascal: Trouble with unit conversions.FreePascal:单位转换的问题。
【发布时间】:2011-11-05 15:02:14
【问题描述】:

当我编译以下代码时,我得到了错误。我不明白其中一些。

代码

program Lasagna;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils
  { you can add units after this };

{$R *.res}
type
  TVehicle = record
    kindOfVehicle : String[30];
    numberOfWheels : Integer;
    horsePower : Real;
  end;

var
  F: file of TVehicle;
  Vehicle : Array [1..3] of TVehicle;
  index : Integer;

begin
     writeln('A RECORD OF DIFFERENT KIND OF VEHICLES.');
     writeln('---------------------------------------');
     writeln;

     AssignFile(F,'C:/Users/W/Desktop/CarRecord.dat');
     writeln('Searching for file.');
     if FileExists('C:/Users/W/Desktop/CarRecord.dat') then
        begin
          writeln('File found. Opening file.');
          Rewrite(F);
          writeln('File ready.');
          writeln;
          writeln;

          for index:=0 to 3 do
          begin
            writeln('Enter the following details for vehicle no. ',index);
            write('Kind of Vehicle: ');
            readln(Vehicle[index].kindOfVehicle);
            write(F,Vehicle[index].kindOfVehicle);//line 45: this is a string so why do I get an error?**

            {Do NOT use writeln() when writing to random access files.}

            write('Number of Wheels: ');
            readln(Vehicle[index].numberOfWheels);
            write(F,IntToStr(Vehicle[index].numberOfWheels));//line 51: The int is converted to string, so i shouldn't get an error?

            write('Horse Power of Vehicle: ');
            readln(Vehicle[index].horsePower);
            write(F, RealToStr(Vehicle[index].horsePower));//line 55:  
            end;

          writeln('Done. Closing File.');
          CloseFile(F);
        end
     else
         Rewrite(F);
         CloseFile(F);
         writeln('File Not Found.');

     Writeln('Press ANY key to close the program.');
     Readln;
end.

错误

编译 Lasagna.lpr

Lasagna.lpr(45,49) 错误:不兼容的类型:得到“ShortString” 预期为“TVehicle”

Lasagna.lpr(51,60) 错误:不兼容的类型:得到“AnsiString” 预期为“TVehicle”

Lasagna.lpr(55,59) 错误:不兼容的类型:得到“AnsiString” 预期为“TVehicle”

Lasagna.lpr(70) 致命:编译模块时出现 3 个错误,正在停止

【问题讨论】:

    标签: type-conversion freepascal


    【解决方案1】:

    在第 21 行,您将 F 声明为“TVehicle 文件”。因此,您应该向其写入 TVehicle 数据,而不是字符串。

    【讨论】:

    • 我明白,但是如何将字符串转换为 TVehicle?谢谢。
    • 完成第三次读取后,Vehicle[index] 包含完整记录。那时你可以做write(F, Vehicle[index]);(并省略所有以前的写)。
    • 天哪,现在看来太明显了!应该这么想。我在思考 Java 的思路,并认为我必须进行一些演员或其他事情。非常感谢你的帮助。非常感谢。
    【解决方案2】:

    在这 3 种情况下,您尝试将字符串写入 F 中,该字符串被声明为 TVehicle 的文件,因此编译器是正确的。

    要修复它,您应该将每个字段读入正确类型的变量,用这些填充 TVehicle 类型变量,或者直接使用 TVehicle 结构的字段并将该变量写入文件。类似这样的事情(我的 Pascal 有点生疏了,很可能不修改就无法编译):

    var intermediateVehicle : TVehicle;
    ....
    write('Kind of Vehicle: ');
    readln(intermediateVehicle.kindOfVehicle);
    write('Number of Wheels: ');
    readln(intermediateVehicle.numberOfWheels);
    write('Horse Power of Vehicle: ');
    readln(intermediateVehicle.horsePower);
    write(F,intermediateVehicle);
    

    当然,错误检查还是要加的……

    【讨论】:

    • 有道理!有没有办法来解决这个问题?我还在掌握 freePascal 的窍门吗?
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2011-04-13
    • 2020-09-26
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多