Typed file functions

Wed, 13 Aug 1997 16:49:59 +0200 (MEST)


Hello, Miguel!

Hello, everybody!  (* Below are some words about ISO vs. Borland Pascal ... *)

According to JoÒo Miguel Domingos:
> 
> Thank you for your very useful help. I apolagize about my constant
> questions but I feel like someone in the desert searching for water.

No problem.  One day, you will read another one's question on this
list, know the answer, and "become water" yourself. :-)

> This code was gaved by you and I think it is working properlly. After
> assigning the file I'm doing :
> 
> reset(f1);
> while not eof(f1) do
>  begin
>  seekread(f1,n); (n is integer);
>  end;
> 
> After the seekread I want to read one record to the variable r1 of type
> tf1. What function do I use to do this.

`read'.

> I know that GPC contains a get
> procedure but the only parametres that it accepts if the file variable.

You can use `get' as well, see below.

The following example program worked on my Linux box:


    Program Test (output, f1);

    type
     tf1 = record
      preco       : integer;
      idade       : integer;
      titulo      : string[90];
      end;

      f1file = file[1..1000] of tf1;

    var
      r1 : tf1;
      f1 : f1file;
      n  : integer;

      Procedure FAssign ( Var t: f1file; Name: String );
      Var
        b : bindingtype;
      begin
        unbind(t);
        b:=binding(t);
        b.name:=name;
        bind(t,b);
        b:=binding(t);
      end;

    begin
     FAssign (f1, 'test.dat');
     rewrite(f1);
     for n:= 1 to 3 do
       begin
         r1.preco:= n;
         write (f1, r1);
       end (* for *);
     FAssign (f1, 'test.dat');
     reset(f1);
     seekread(f1,2);
     get (f1);  (* Read a value into the "file variable" `f1^' *)
     r1:= f1^;  (* Assign the value of the file variable to `r1' *)
     writeln (r1.preco);  (* Must be 2 *)
    end.


Or, using `read' (compatible to Borland Pascal which does not support `get'):


     reset(f1);
     seekread(f1,2);
     read (f1, r1);   (* Same as `get (f1); r1:= f1^'; *)
     writeln (r1.preco);  (* Must be 2 *)


Without the `(output, f1)' in the program's headline it does not work. :-(
I consider this a bug in GPC; others might consider this a feature.

Okay, ISO Pascal, as far as I have understood it, requires all files to appear
in the program headline.  While GPC partially supports this, I am sure that it
does not yet comply to the requirements of the standard.  OTOH, I consider
this a bug anyway:  I see no use for this, and - correct me if I am wrong -
makes it a pain to write a large program (> 50000 lines) which reads and
writes *many* files at *many* uncorrelated places.

Thus, GPC's standard behaviour should be as follows:

  * Accept program headline parameters, but don't require them.

  * If program headline parameters are given, do all checks required by ISO.

  * If they are not given, allow to do everything with files which is
    allowed by UCSD and Borland Pascal.

  * With `--standard-pascal', `--extended-pascal', or whatever, these
    parameters are required.  (Already the case.)

I would be glad if somebody sent me test programs which show deficiencies in
GPC's treatment of program headline parameters - both concerning ISO Pascal
requirements and the treatment of files in UCSD/Borland Pascal.

For example, GPC should work with the following (but doesn't):


    Program Test;  (* Doesn't work without `F' parameter *)

    Var
      F: file of Integer;
      n: Integer;

    begin
      Assign ( F, 'test.dat' );
      rewrite ( F );
      for n:= 0 to 5 do
        write ( F, n );
      close ( F );
      reset ( F );
      Seek ( F, 4 );  (* `Seek' unknown; must use `SeekRead' *)
      read ( F, n );
      writeln ( n );
      close ( f );
    end.


There are probably more, independent cases where GPC fails to compile valid
UCSD/Borland Pascal.  And a similar example can certainly be constructed for
valid Extended Pascal rejected by GPC - or invalid Extended Pascal accepted
by "gpc --extended-pascal".  Please help to improve GPC by finding all these
cases and posting test programs here!

Greetings,

    Peter

 Dipl.-Phys. Peter Gerwinski, Essen, Germany, free physicist and programmer
peter.gerwinski@uni-essen.de - http://home.pages.de/~peter.gerwinski/ [970201]
 maintainer GNU Pascal [970714] - http://home.pages.de/~gnu-pascal/ [970125]


Peter Gerwinski (peter@agnes.dida.physik.NO-SPAM-PLEASE.de)

HTML conversion by Lluís de Yzaguirre i Maura
Institut de Lingüística Aplicada - Universitat "Pompeu Fabra"
e-mail: de_yza@upf.es