переопределение Reset для typedfile

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

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

Ответить
Аватара пользователя
Vlad04
новенький
Сообщения: 80
Зарегистрирован: 11.12.2007 20:11:19
Откуда: Караганда. Казахстан

переопределение Reset для typedfile

Сообщение Vlad04 »

Добрый день. Переопределение процедуры reset для типизированных файлов выдаёт RunError(2). Для бестиповых и текстовых файлов такой ошибки нет. Как решить?

Код: Выделить всё

procedure Reset(var F : typedfile);
begin
  system.Reset(F);
end;

procedure TMyApplication.DoRun;
var
  F : file of char;
begin
  assignfile(F, 'testreset.lpr');
  reset(F);
  closefile(F);
  Terminate;
end;
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
DYUMON
постоялец
Сообщения: 234
Зарегистрирован: 11.03.2009 12:32:54
Контактная информация:

Сообщение DYUMON »

Возвращает ошибку , что файл не найден?
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

А что такое typedfile?

Вот в таком виде работает

Код: Выделить всё

program testreset;

{$mode objfpc}{$H+}

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

type

  { TMyApplication }

  TMyApplication = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
  end;

  FileOfChar = file of Char;

{ TMyApplication }

procedure Reset(var F : FileOfChar);
begin
  system.Reset(F);
end;

procedure TMyApplication.DoRun;
var
  F : file of Char;
begin
  assignfile(F, 'testreset.lpr');
  reset(F);
  closefile(F);
  Terminate;
end;

constructor TMyApplication.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  StopOnException:=True;
end;

var
  Application: TMyApplication;
begin
  Application:=TMyApplication.Create(nil);
  Application.Title:='My Application';
  Application.Run;
  Application.Free;
end.
Аватара пользователя
Vlad04
новенький
Сообщения: 80
Зарегистрирован: 11.12.2007 20:11:19
Откуда: Караганда. Казахстан

Сообщение Vlad04 »

iskander писал(а):А что такое typedfile?

Обобщение для file of <type>.
В модуле system определены четыре процедуры Reset

Код: Выделить всё

Procedure Reset(var f:File;l:Longint);
Procedure Reset(var f:File);
Procedure Reset(var f : TypedFile);
Procedure Reset(var t:Text);

procedure Reset(var F : FileOfChar); - хорошо, что это работает, но требуется общее решение, для различных типов.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Vlad04 писал(а):Обобщение для file of <type>.

А где он объявлен?
Аватара пользователя
Vlad04
новенький
Сообщения: 80
Зарегистрирован: 11.12.2007 20:11:19
Откуда: Караганда. Казахстан

Сообщение Vlad04 »

iskander писал(а):А где он объявлен?

наверное там же, где и file, и text
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Vlad04 писал(а):наверное там же, где и file, и text

Беглый поиск в документации и исходниках rtl ничего не дал.
Внутренний псевдотип компилятора?
Код, который fpc генерит (x86) для вашего Reset:

Код: Выделить всё

  xor    edx,edx
  call   fpc_reset_typed
  call   fpc_iocheck 

fpc_reset_typed описана в compproc.inc как

Код: Выделить всё

Procedure fpc_reset_typed(var f : TypedFile;Size : Longint); compilerproc;

т.е. она вызывается как fpc_reset_typed(F, 0), информация о размере записи игнорируется.
Мне кажется, что все это похоже на глюк компилятора, т.е. либо на строке

Код: Выделить всё

  procedure Reset(var F : typedfile);

он должен был сгенерировать ошибку Error: Identifier not found "typedfile", либо корректно использовать информацию о размере записи файла.
Ответить