[Oberon] Runtime array in Oberon-07

thutt at harp-project.com thutt at harp-project.com
Tue Oct 18 23:40:22 CEST 2022


Joerg writes:
 > nice.
 > Two suggestions:
 > - Wrap a „IF pos>=0“ around Put and Get, just to be sure :-)
 > - IF a <> NIL might help get around a trap on tmp.next.
 > 
 > br
 > Jörg
 > 
 > > Am 18.10.2022 um 17:08 schrieb Ivan Denisov <d.ivan.krsk at gmail.com>:
 > > 
 > > Hi
 > > 
 > > 
 > > I made some list realization of dynamic arrays.
 > > 
 > > MODULE Dyn;
 > > 
 > > CONST size = 100;
 > > 
 > > TYPE
 > >     Array* = POINTER TO ArrayDesk;
 > >     ArrayDesk = RECORD a: ARRAY size OF REAL; next: Array END;


You could make this even more dynamic by adding a 'start' field to
ArrayDesk.  It would represent the starting index of the block:

   ASSERT(start MOD size = 0);

With a 'start' field, in the Put() procedure, at most one ArrayDesk
needs to be allocated.  In Get(), search for the ArrayDesk that will
contain 'pos'.  If it's not present, return the value for
uninitialized elements.




 > > 
 > > PROCEDURE New* (): Array;
 > > VAR a: Array;
 > > BEGIN
 > >  NEW(a);
 > >  RETURN a
 > > END New;
 > > 
 > > PROCEDURE Put* (a: Array; pos: INTEGER; val: REAL);
 > > VAR tmp: Array; i: INTEGER;
 > > BEGIN
 > >     tmp := a;
 > >  FOR i := 1 TO pos DIV size DO
 > >   IF tmp.next = NIL THEN NEW(tmp.next) END;
 > >   tmp := tmp.next
 > >  END;
 > >  tmp.a[pos MOD size] := val
 > > END Put;
 > > 
 > > PROCEDURE Get* (a: Array; pos: INTEGER): REAL;
 > > VAR tmp: Array; i: INTEGER;
 > > BEGIN
 > >  tmp := a;
 > >  FOR i := 1 TO pos DIV size DO
 > >   IF tmp.next = NIL THEN NEW(tmp.next) END;
 > >   tmp := tmp.next
 > >  END;
 > >  RETURN tmp.a[pos MOD size]
 > > END Get;
 > > 
 > > END Dyn.
 > > 
 > > 
 > > Then you can use
 > > 
 > > 
 > > MODULE Init;
 > > 
 > > IMPORT Log, Dyn;
 > > 
 > > VAR a: Dyn.Array;
 > > 
 > > PROCEDURE Do;
 > > BEGIN
 > >  a := Dyn.New();
 > >  Dyn.Put(a, 1500, 3.14);
 > >  Log.Real(Dyn.Get(a, 1500)); Log.Ln
 > > END Do;
 > > 
 > > BEGIN
 > >  Do
 > > END Init.
 > > 
 > > 
 > > https://online.oberon.org/model/311
 > > 
 > > 
 > > Kind regards,
 > > 
 > > Ivan Denisov
 > > 
 > > 
 > > 
 > > 18.10.2022 21:37, Deadmarshal пишет:
 > >> Hi,
 > >> 
 > >> I've read that in Oberon-07 we can't have a pointer to an array, and I was wondering how we can set the size of an array at runtime. I want to do something similar to the below code snippet:
 > >> 
 > >> MODULE Test;
 > >> (*Oberon-2 compatible*)
 > >> IMPORT In,Out;
 > >> 
 > >> VAR
 > >>   PA:POINTER TO ARRAY OF INTEGER;
 > >>   N,Input,I:INTEGER;
 > >> 
 > >> BEGIN
 > >>   Out.String("Size of array: "); Out.Ln;
 > >>   In.Int(N);
 > >>   NEW(PA,N);
 > >>   Out.String("Enter Items: "); Out.Ln;
 > >>   FOR I := 0 TO N-1 DO
 > >>     In.Int(Input);
 > >>     PA[I] := Input;
 > >>   END;
 > >>   FOR I := 0 TO N-1 DO
 > >>     Out.Int(PA[I],0);
 > >>     Out.Char(' ');
 > >>   END;
 > >>   Out.Ln;
 > >> END Test.
 > >> 
 > >> 
 > >> --
 > >> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
 > >> https://lists.inf.ethz.ch/mailman/listinfo/oberon
 > > --
 > > Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
 > > https://lists.inf.ethz.ch/mailman/listinfo/oberon
 > --
 > Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
 > https://lists.inf.ethz.ch/mailman/listinfo/oberon

-- 
My kid can beat up your honor student.




More information about the Oberon mailing list