FreePascal: проблема с преобразованием единиц измерения. - PullRequest
0 голосов
/ 29 августа 2011

Когда я компилирую следующий код, я получаю ошибки.Я не понимаю некоторых из них.

Код

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

Лазанья.lpr (45,49) Ошибка: несовместимые типы: получено «ShortString» ожидаемое «TVehicle»

Lasagna.lpr (51,60) Ошибка: несовместимые типы: получено «AnsiString» ожидаемое «TVehicle»

Lasagna.lpr (55,59) Ошибка: несовместимые типы: получено "AnsiString", ожидается "TVehicle"

Lasagna.lpr (70) Неустранимо: было 3 ошибки модуля компиляции, остановка

Ответы [ 2 ]

1 голос
/ 29 августа 2011

В строке 21 вы объявляете F как «файл TVehicle».Поэтому вы должны записывать в него данные TVehicle, а не строки.

1 голос
/ 29 августа 2011

В этих 3 случаях вы пытаетесь записать строку в F, которая объявлена ​​как файл TVehicle, поэтому компилятор прав.

Чтобы исправить это, вы должны прочитать каждое поле в переменную правильного типа, заполнить их переменной типа TVehicle или напрямую использовать поля структуры TVehicle и записать эту переменную в файл. Что-то в этом роде (мой Паскаль становится немного ржавым, скорее всего, это не скомпилируется, не затронув его):

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);

Конечно, еще нужно добавить проверку ошибок ...

...