96 lines
2.7 KiB
Plaintext
96 lines
2.7 KiB
Plaintext
BEGIN ! Concatenate arrays - of REAL, here;
|
|
|
|
CLASS REAL_ARRAY(N); INTEGER N;
|
|
BEGIN
|
|
REAL ARRAY DATA(1:N);
|
|
|
|
! Return a new REAL_ARRAY containing
|
|
! the values from this REAL_ARRAY
|
|
! followed by the values from other;
|
|
REF(REAL_ARRAY) PROCEDURE CONCAT(other);
|
|
REF(REAL_ARRAY) other;
|
|
BEGIN
|
|
REF(REAL_ARRAY) C;
|
|
INTEGER I;
|
|
|
|
C :- NEW REAL_ARRAY(N + other.N);
|
|
|
|
FOR I := 1 STEP 1 UNTIL N DO
|
|
C.DATA(I) := DATA(I);
|
|
|
|
FOR I := 1 STEP 1 UNTIL other.N DO
|
|
C.DATA(N + I) := other.DATA(I);
|
|
|
|
CONCAT :- C;
|
|
END;
|
|
|
|
! Fill DATA;
|
|
REF(REAL_ARRAY) PROCEDURE linearFill(start, stride);
|
|
REAL start, stride;
|
|
BEGIN
|
|
linearFillFrom(DATA, 1, N, start, stride);
|
|
linearFill :- this REAL_ARRAY
|
|
END;
|
|
|
|
PROCEDURE out(sink); REF(printfile) sink;
|
|
BEGIN
|
|
INTEGER i;
|
|
FOR i := 1 STEP 1 UNTIL N DO
|
|
sink.OUTFIX(DATA(i), 2, 7);
|
|
sink.OUTIMAGE;
|
|
END;
|
|
END REAL_ARRAY;
|
|
|
|
! "The problem" is not array as an input parameter:
|
|
! I don't know how to
|
|
! "pass a new ARRAY out of a PROCEDURE";
|
|
REF(REAL_ARRAY) PROCEDURE concatenate(a, b);
|
|
REAL ARRAY a, b;
|
|
BEGIN
|
|
INTEGER i, a_, N, b_, M;
|
|
REF(REAL_ARRAY) c;
|
|
a_ := LOWERBOUND(a, 1) - 1;
|
|
N := UPPERBOUND(a, 1) - a_;
|
|
b_ := LOWERBOUND(a, 1) - 1;
|
|
M := UPPERBOUND(b, 1) - b_;
|
|
c :- NEW REAL_ARRAY(N + M);
|
|
|
|
FOR i := 1 STEP 1 UNTIL N DO
|
|
c.DATA(i) := a(a_+i);
|
|
! for readability, don't
|
|
! reduce one index expression to a variable
|
|
FOR i := 1 STEP 1 UNTIL M DO
|
|
c.DATA(N + i) := b(b_+i);
|
|
|
|
concatenate :- c;
|
|
END concatenate REAL ARRAYs;
|
|
|
|
! two more convenience PROCEDUREs;
|
|
PROCEDURE linearFillFrom(a, from, inclusive, start, stride);
|
|
REAL ARRAY a; ! passed by reference;
|
|
INTEGER from, inclusive;
|
|
REAL start, stride;
|
|
BEGIN
|
|
INTEGER i;
|
|
FOR i := from STEP 1 UNTIL inclusive DO
|
|
a(i) := start + stride * (i - from)
|
|
END;
|
|
PROCEDURE linearFill(a, start, stride);
|
|
REAL ARRAY a;
|
|
REAL start, stride;
|
|
linearFillFrom(a, LOWERBOUND(a, 1), UPPERBOUND(a, 1),
|
|
start, stride);
|
|
|
|
|
|
REF(REAL_ARRAY) X;
|
|
REAL ARRAY u(1:3), v(1:4);
|
|
linearFill(u, 3, 7);
|
|
linearFill(v, 0, 5);
|
|
concatenate(u, v).out(SYSOUT);
|
|
|
|
X :- NEW REAL_ARRAY(3).linearFill(1, 2);
|
|
X.out(SYSOUT);
|
|
X.CONCAT(NEW REAL_ARRAY(4)
|
|
.linearFill(-1, -3)).out(SYSOUT);
|
|
END.
|