Polymorfism ?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Polymorfism ?

Сообщение gogonk » 13.06.2008 01:23:48

Код: Выделить всё
program Untitled;
uses
   SysUtils;
type
   TItems = record
      id: integer;
      name: string;
   end;

   T1 = class
      procedure add(p: Pointer);
      function getRecord: Pointer; virtual;
   end;

   T2 = class(T1)
      t: TItems;
      function getRecord: Pointer; override;
   end;

procedure T1.add(p: pointer);
var
   f: FILE;
begin
   assignfile(f,'data.txt');
   reset(f);
   write(f, getRecord^);  ??????????????????
   close(f);
end;
function T1.getRecord: pointer;
begin
   result := NIL;
end;
function T2.getRecord: pointer;
begin
   result := @t;
end;
begin
   writeln('Hello');
   readln;
end.

Почему fpc дает ошибка здесь : write(f, getRecord^);
f: FILE не может. Нужно было FILE of ...
Дельфи этот компилирует.
gogonk
незнакомец
 
Сообщения: 3
Зарегистрирован: 12.06.2008 23:37:20

Re: Polymorfism ?

Сообщение mike » 13.06.2008 02:44:56

Потому что GetRecord возвращает нетипизированный указатель, следовательно тип данных конструкции GetRecord^ не определен. Функции же wite/writeln умеют выводить только строки и перечисляемые типы (Integer, Boolean и т.п.), исключением является только указатель PChar, который интерпретируется как строка. Все что угодно в нетипизированный файл умеет выводить функция BlockWrite.

Простейшее решение состоит в замене write(f, getRecord^) на BlockWrite(f, getRecord^, SizeOf(TItems)), но тогда открвать файл нужно вызовом Reset(f, 1). Либо наоборот, файл открываем с указанием полного размера используемого блока Reset(f, SizeOf(TItems)), а пишем уже только один такой блок BlockWrite(f, getRecord^, 1).
mike
новенький
 
Сообщения: 40
Зарегистрирован: 23.02.2007 17:25:00

Re: Polymorfism ?

Сообщение gogonk » 13.06.2008 09:54:07

Т.е. в fpc нет поздное связивание как в Delphi ?
gogonk
незнакомец
 
Сообщения: 3
Зарегистрирован: 12.06.2008 23:37:20

Re: Polymorfism ?

Сообщение ev » 13.06.2008 10:27:22

gogonk
учимся юзать теги форума ;)
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Re: Polymorfism ?

Сообщение gogonk » 13.06.2008 10:39:08

Аха, это супер.
gogonk
незнакомец
 
Сообщения: 3
Зарегистрирован: 12.06.2008 23:37:20

Re: Polymorfism ?

Сообщение v-t-l » 13.06.2008 16:29:52

А то, что файл открыт Reset вместо Rewrite или Append, - это ничего?
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Polymorfism ?

Сообщение Sergei I. Gorelkin » 13.06.2008 16:45:22

Чтобы FPC вел себя, как Дельфи, нужно в начале программы писать {$mode delphi}{$h+}. Или компилировать с ключом -Sdh.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Polymorfism ?

Сообщение Михаил Крамер » 05.08.2008 21:18:29

М-да... Полиморфизм.... А так почему нельзя?

Код: Выделить всё
type
   T1 = class
    public
           procedure write(f:text); virtual; abstract;
    end;
    T2 = class (t1)
    public
          procedure write(f:text); virtual;
    end;
procedure t2.write(f:text);
begin
    write(f, 'Бребедень всякая');
end;


А то, ммм.., как то коряво выглядела прога - что за полиморфизм, если нужно sizeof делать?
Михаил Крамер
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2008 14:26:40

Re: Polymorfism ?

Сообщение Sergei I. Gorelkin » 06.08.2008 00:47:54

Так тоже можно, только:
1) переменную типа файл нужно передавать по ссылке: procedure write(var f:text);
2) Если используем классы, то для перекрытия метода нужно ключевое слово override.

С учетом исправлений получается:
Код: Выделить всё
type
   T1 = class
    public
           procedure write(var f:text); virtual; abstract;
    end;
    T2 = class (t1)
    public
          procedure write(var f:text); override;
    end;

procedure t2.write(var f:text);
begin
    write(f, 'Бребедень всякая');
end;
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Polymorfism ?

Сообщение Михаил Крамер » 06.08.2008 15:08:47

М-да, синтаксис то я и подзабыл.

Но возвращать адрес поля класса, да ещё и из виртуальной функции - это не ООП, а нечто неописуемое. Можно же всю абстракцию порушить! Да и программу!
Михаил Крамер
новенький
 
Сообщения: 73
Зарегистрирован: 08.02.2008 14:26:40


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru