[Oberon] Runtime array in Oberon-07

Joerg joerg.straube at iaeth.ch
Tue Oct 18 20:51:59 CEST 2022


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;
> 
> 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


More information about the Oberon mailing list