FreePascal: проблема с преобразованием единиц измерения.

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

Код

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) Fatal: 3 ошибки при компиляции модуля, остановка


person W.K.S    schedule 28.08.2011    source источник


Ответы (2)


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

person undur_gongor    schedule 28.08.2011
comment
Я это понимаю, но как преобразовать строку в TVehicle? Спасибо. - person W.K.S; 29.08.2011
comment
После того, как вы сделали третье чтение, Vehicle[index] содержит полную запись. В этот момент вы можете просто выполнить write(F, Vehicle[index]); (и пропустить все предыдущие записи). - person undur_gongor; 29.08.2011
comment
Боже мой, теперь это кажется таким очевидным! Надо было подумать. Я думал в том же духе, что и Java, и подумал, что мне придется сделать какой-то кастинг или что-то в этом роде. Большое спасибо за твою помощь. Очень ценится. - person W.K.S; 29.08.2011

В этих трех случаях вы пытаетесь записать строку в 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);

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

person fvu    schedule 28.08.2011
comment
Это имеет смысл! Есть ли способ исправить это? Я все еще осваиваю freePascal? - person W.K.S; 29.08.2011