[comp.lang.ada] VAX Ada sequential IO and Direct IO

alden@trwrb.UUCP (04/09/87)

Has anyone had problems with VAX Ada sequential_io and direct_IO when
instantiated with a discriminated record type which has an unconstrained
component.  I keep getting use_error raised when doing a create or open.

example


type foo(a : integer) is
	record
	   f1 : string(1..a);
	end record;

even if I restrict the range of 'a' by using a subtype of integer, or
create an integer type with a restricted range I still get a use_error.
In addition to the use error, an RMS error is listed as max record size 
exceeded.

	... Tony Alden
	(TRW)

gary@APLPY.ARPA.UUCP (04/14/87)

> Has anyone had problems with VAX Ada sequential_io and direct_IO when
> instantiated with a discriminated record type which has an unconstrained
> component.  I keep getting use_error raised when doing a create or open.
> 
> example
> 
> 
> type foo(a : integer) is
> 	record
> 	   f1 : string(1..a);
> 	end record;
> 
> even if I restrict the range of 'a' by using a subtype of integer, or
> create an integer type with a restricted range I still get a use_error.
> In addition to the use error, an RMS error is listed as max record size 
> exceeded.
> 
> 	... Tony Alden
> 	(TRW)
> 
> 
We've been able to use sequential and direct io with discrimant
records successfully by specifying a default discriminant value,
i.e. the records have to be "constrained" at time of
instantiation of io package.

	You might try something like the following:

  type foo(a : integer := MAXLENGTH) is
  	record
  	   f1 : string(1..a);
  	end record;
  
  package rec_io is new sequential_io(foo);


	Good Luck,

				Gary Gafke
				gary@aplpy.arpa
			or	seismo!mimsy!aplcen!gary
			or	(301) 953-6999

systeam@gmdka.UUCP (04/22/87)

If you have problems with Ada Sequential IO and Direct IO
you may use our validated Ada Compiler version 1.6A for VAX/VMS.

As the following example shows it has no problems with these Ada features.

For obvious reasons a use_error would be raised if you would try to create
a "real" direct file of type dir_io.file_type.
But if you use an index-sequential file to implement this direct file then
no problem arises. You can get an index-sequential file when using a form
parameter in the create operation.

We also played with Tony Alden's "even if I restrict the range of 'a' ..." 
remark for the Direct IO case (cf. cdir_f).

My address:

   Dr. Peter Dencker
   SYSTEAM KG Dr. Winterstein
   Am Rueppurer Schloss 7
   D 7500 Karlsruhe 51
   West Germany

   UUCP-mail:  systeam@gmdka


Ada Example:
------------

WITH text_io; USE  text_io;
WITH sequential_io;
WITH direct_io;

PROCEDURE unconstr_io IS

   TYPE foo(a : integer) IS
      RECORD
         f1 : string (1..a);
      END RECORD;

   item3 : foo (3) := (a => 3, f1 => "abc");
   item4 : foo (4) := (a => 4, f1 => "1234");

   SUBTYPE int IS integer RANGE 1 .. 150;

   TYPE cfoo(a : int) IS  -- discriminant with restricted subtype
      RECORD
         f1 : string (1..a);
      END RECORD;

   citem3 : cfoo (3) := (a => 3, f1 => "abc");
   citem4 : cfoo (4) := (a => 4, f1 => "1234");
           
   PACKAGE seq_io IS NEW sequential_io (foo);
   seq_f : seq_io.file_type;

   PACKAGE dir_io IS NEW direct_io (foo);
   dir_f : dir_io.file_type;

   PACKAGE cdir_io IS NEW direct_io (cfoo);
   cdir_f : cdir_io.file_type;
BEGIN
-----------------------------------------------------------------
   put_line ("Sequential_io test:");
   seq_io.create (seq_f, name => "unconstr_io.seq");
   seq_io.write (seq_f, item3);
   seq_io.write (seq_f, item4);
   seq_io.close (seq_f);

   item3 := (3, "   ");
   item4 := (4, "    ");

   seq_io.open (seq_f, seq_io.in_file, "unconstr_io.seq");
   seq_io.read (seq_f, item3);
   seq_io.read (seq_f, item4);
   seq_io.close (seq_f);

   put_line (integer'image(item3.a) & ", " & item3.f1);
   put_line (integer'image(item4.a) & ", " & item4.f1);
-----------------------------------------------------------------
   put_line ("Direct_io test:");
   dir_io.create 
      (dir_f, name => "unconstr_io.drc",
              form => "ORGANIZATION => INDEXED, RECORD_FORMAT => VARIABLE");
   FOR i IN 1 .. 10
   LOOP dir_io.write (dir_f, item4);
        dir_io.write (dir_f, item3);
   END LOOP;
   put_line ("current size of " & dir_io.name (dir_f) & " is "
             & dir_io.count'image (dir_io.size (dir_f)));
   dir_io.close (dir_f);

   item3 := (3, "   ");
   item4 := (4, "    ");

   dir_io.open (dir_f, dir_io.in_file, "unconstr_io.drc");
   put_line ("current index is " & dir_io.count'image (dir_io.index(dir_f)));
   dir_io.read (dir_f, item4);
   put_line ("current index is " & dir_io.count'image (dir_io.index(dir_f)));
   put_line (integer'image(item4.a) & ", " & item4.f1);
   dir_io.read (dir_f, item3);
   put_line ("current index is " & dir_io.count'image (dir_io.index(dir_f)));
   put_line (integer'image(item3.a) & ", " & item3.f1);

   item3 := (3, "   ");
   item4 := (4, "    ");

   dir_io.read (dir_f, item3, from => 18);
   put_line ("current index is " & dir_io.count'image (dir_io.index(dir_f)));
   put_line (integer'image(item3.a) & ", " & item3.f1);
   dir_io.read (dir_f, item4, from => 15);
   put_line ("current index is " & dir_io.count'image (dir_io.index(dir_f)));
   put_line (integer'image(item4.a) & ", " & item4.f1);
   dir_io.close (dir_f);
-----------------------------------------------------------------
   put_line ("Restricted direct_io test:");
   cdir_io.create (cdir_f, name => "unconstr_io.cdr");
   FOR i IN 1 .. 10
   LOOP cdir_io.write (cdir_f, citem4);
        cdir_io.write (cdir_f, citem3);
   END LOOP;
   put_line ("current size of " & cdir_io.name (cdir_f) & " is "
             & cdir_io.count'image (cdir_io.size (cdir_f)));
   cdir_io.close (cdir_f);

   citem3 := (3, "   ");
   citem4 := (4, "    ");

   cdir_io.open (cdir_f, cdir_io.in_file, "unconstr_io.cdr");
   put_line ("current index is " & cdir_io.count'image (cdir_io.index(cdir_f)));
   cdir_io.read (cdir_f, citem4);
   put_line ("current index is " & cdir_io.count'image (cdir_io.index(cdir_f)));
   put_line (int'image(citem4.a) & ", " & citem4.f1);
   cdir_io.read (cdir_f, citem3);
   put_line ("current index is " & cdir_io.count'image (cdir_io.index(cdir_f)));
   put_line (int'image(citem3.a) & ", " & citem3.f1);

   citem3 := (3, "   ");
   citem4 := (4, "    ");

   cdir_io.read (cdir_f, citem3, from => 18);
   put_line ("current index is " & cdir_io.count'image (cdir_io.index(cdir_f)));
   put_line (int'image(citem3.a) & ", " & citem3.f1);
   cdir_io.read (cdir_f, citem4, from => 15);
   put_line ("current index is " & cdir_io.count'image (cdir_io.index(cdir_f)));
   put_line (int'image(citem4.a) & ", " & citem4.f1);
   cdir_io.close (cdir_f);
END;

Compilation Log:
----------------

KARLSRUHE ADA SYSTEM  -  VAX/VMS version by    S Y S T E A M 
          Installation Date:  2-MAR-1987
compiling  BIG0:[PD.ADATEST.SRC]UNCONSTR_IO.ADA;14
in library BIG0:[PD.ADATEST.ADALIB]
KARLSRUHE ADA SYSTEM  -  COMPILER              VERSION  1.6A
KARLSRUHE ADA COMPILER - SYNTAX
KARLSRUHE ADA COMPILER - LIBREAD
KARLSRUHE ADA COMPILER - SEMANTIC
KARLSRUHE ADA COMPILER - EXPAND
KARLSRUHE ADA COMPILER - TRANSFORM
KARLSRUHE ADA COMPILER - OPTIMIZE
KARLSRUHE ADA COMPILER - CODEGEN
KARLSRUHE ADA COMPILER - LIBWRITE
KARLSRUHE ADA COMPILER - LISTING
PROCEDURE  UNCONSTR_IO,   Library Index   46
*** No Errors during Compilation ***
CPU Time used :    30.6  Seconds

Execution Log:
--------------

Sequential_io test:
 3, abc
 4, 1234
Direct_io test:
current size of BIG0:[PD.ADATEST]UNCONSTR_IO.DRC;9 is  20
current index is  1
current index is  2
 4, 1234
current index is  3
 3, abc
current index is  19
 3, abc
current index is  16
 4, 1234
Restricted direct_io test:
current size of BIG0:[PD.ADATEST]UNCONSTR_IO.CDR;2 is  20
current index is  1
current index is  2
 4, 1234
current index is  3
 3, abc
current index is  19
 3, abc
current index is  16
 4, 1234