June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
|
|
@ -1,50 +1,95 @@
|
|||
BEGIN
|
||||
BEGIN ! Concatenate arrays - of REAL, here;
|
||||
|
||||
CLASS ARRAYHOLDER(N); INTEGER N;
|
||||
CLASS REAL_ARRAY(N); INTEGER N;
|
||||
BEGIN
|
||||
REAL ARRAY DATA(1:N);
|
||||
END;
|
||||
|
||||
REF(ARRAYHOLDER) PROCEDURE CONCAT(A, B); REF(ARRAYHOLDER) A, B;
|
||||
! 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
|
||||
REF(ARRAYHOLDER) C;
|
||||
INTEGER I, J;
|
||||
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);
|
||||
|
||||
C :- NEW ARRAYHOLDER(A.N + B.N);
|
||||
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);
|
||||
|
||||
FOR I := 1 STEP 1 UNTIL A.N DO
|
||||
BEGIN
|
||||
J := J+1; C.DATA(J) := A.DATA(I);
|
||||
END;
|
||||
concatenate :- c;
|
||||
END concatenate REAL ARRAYs;
|
||||
|
||||
FOR I := 1 STEP 1 UNTIL B.N DO
|
||||
BEGIN
|
||||
J := J+1; C.DATA(J) := B.DATA(I);
|
||||
END;
|
||||
|
||||
CONCAT :- C;
|
||||
! 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(ARRAYHOLDER) X, Y, Z;
|
||||
INTEGER I;
|
||||
|
||||
X :- NEW ARRAYHOLDER(3);
|
||||
Y :- NEW ARRAYHOLDER(4);
|
||||
|
||||
I := 0;
|
||||
I := I+1; X.DATA(I) := 2*I;
|
||||
I := I+1; X.DATA(I) := 2*I;
|
||||
I := I+1; X.DATA(I) := 2*I;
|
||||
|
||||
I := 0;
|
||||
I := I+1; Y.DATA(I) := -3*I;
|
||||
I := I+1; Y.DATA(I) := -3*I;
|
||||
I := I+1; Y.DATA(I) := -3*I;
|
||||
I := I+1; Y.DATA(I) := -3*I;
|
||||
|
||||
Z :- CONCAT(X, Y);
|
||||
FOR I := 1 STEP 1 UNTIL Z.N DO
|
||||
OUTFIX(Z.DATA(I), 2, 7);
|
||||
OUTIMAGE;
|
||||
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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue