Краткий ответ: PRACTICE не поддерживает массивы макросов.
Более длинный ответ: PRACTICE может выполнять рекурсивное расширение макроса, что позволяет вам делать что-то похожее, чем настоящие массивы. (См. «Макросы PRACTICE» в Practice_user.pdf)
E.g.:
LOCAL &myarr0 &myarr1 &myarr2 &myarr3
LOCAL &data &i
&data="zero|one|two|three"
// Assign values to &myarra0 to &myarra3 in a loop
&i=0.
WHILE &i<4.
(
PRIVATE &cmd
&cmd="&"+"myarr"+FORMAT.Decimal(1,&i)+"=STRing.SPLIT(""&"+"data"",""|"",&i)"
&&cmd // << evaluate with recursive macro expansion
&i=&i+1.
)
// Print values saved in &myarra0 to &myarra3 in a loop
&i=0.
WHILE &i<4.
(
PRIVATE &val
&val="&"+"myarr"+FORMAT.Decimal(1,&i)
&&val="&val" // << assign with recursive macro expansion
ECHO "&val"
&i=&i+1.
)
Если вам не нужно слишком много макросов GLOBAL, вы также можете создать псевдомассив в цикле, подобном этому:
LOCAL &i
&i=0
WHILE &i<4.
(
PRIVATE &cmd
&cmd="GLOBAL "+"&"+"myarr"+FORMAT.Decimal(1,&i)
&cmd
&i=&i+1
)
Я бы не стал этого делать, потому что мне не нравятся ГЛОБАЛЬНЫЕ макросы.
Временное решение: создайте массив с помощью Var.NEWLOCAL
E.g.:
Var.NEWLOCAL char[4][32] \myarr
LOCAL &i &data
&data="zero|one|two|three"
// Assign values to \myarr in a loop
&i=0.
WHILE &i<4
(
PRIVATE &val
&val=STRing.SPLIT("&data","|",&i)
Var.Assign \myarr[&i]="&val"
&i=&i+1.
)
// Print values saved in \myarr in a loop
&i=0.
WHILE &i<4
(
ECHO Var.STRing(\myarr[&i])
&i=&i+1.
)
person
Holger
schedule
08.11.2019