ScrollLock писал(а):
Доступ к содержимому массива получается через функции, возвращающие указатель типа void * на начало массива, через который и идёт работа с данными.
Возможно, тут поможет (недокументированная) SYSTEM.THISARRAY (искать в SqlDB), которая формирует параметр-открытый массив:
Код:
MODULE PrivTestArray;
IMPORT SYSTEM, Log, In := i21sysIn;
PROCEDURE LogArray (IN x: ARRAY OF INTEGER);
VAR i: INTEGER;
BEGIN
i := 0;
WHILE i < LEN(x) DO
Log.Int(x[i]);
INC(i)
END;
Log.Ln
END LogArray;
PROCEDURE DoubleElems (VAR x: ARRAY OF INTEGER);
VAR i: INTEGER;
BEGIN
i := 0;
WHILE i < LEN(x) DO
x[i] := 2 * x[i];
INC(i)
END
END DoubleElems;
PROCEDURE Do*;
VAR
a: ARRAY 10 OF INTEGER;
i: INTEGER;
unsafeArrayLen: INTEGER;
unsafeArrayAdr: INTEGER;
BEGIN
In.Open;
i := 0; In.Int(a[i]);
WHILE In.done DO
INC(i); In.Int(a[i])
END;
IF i > 0 THEN
unsafeArrayLen := i;
unsafeArrayAdr := SYSTEM.ADR(a);
LogArray(SYSTEM.THISARRAY(unsafeArrayAdr, unsafeArrayLen));
DoubleElems(SYSTEM.THISARRAY(unsafeArrayAdr, unsafeArrayLen));
LogArray(SYSTEM.THISARRAY(unsafeArrayAdr, unsafeArrayLen))
END
END Do;
END PrivTestArray.
^Q PrivTestArray.Do
^Q PrivTestArray.Do 1 3
^Q PrivTestArray.Do 2 -4 6 -8 10