Search code examples
trace32lauterbach

How to declare an array with macros in Lauterbach CMM script


I would like to create an array with Macros in Lauterbach CMM script.

I tried the following:

LOCAL &ARRAY_VAR[10]

This syntax doesn't work.

I know how to create array with Var.NEWLOCAL:

Var.NEWLOCAL int[3] \ARRAY_VAR

Is there any way to create macros with array?


Solution

  • Short answer: PRACTICE does not support macro arrays.


    Longer answer: PRACTICE can do a recursive macro expansion, which allows you to do something similar than real arrays. (See "PRACTICE Macros" in 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.
    )
    

    If you don't care of having too many GLOBAL macros you can also create the pseudo-array in a loop like this:

    LOCAL &i
    &i=0
    WHILE &i<4.
    (
        PRIVATE &cmd
        &cmd="GLOBAL "+"&"+"myarr"+FORMAT.Decimal(1,&i)
        &cmd
        &i=&i+1
    )
    

    I wouldn't do that because I don't like GLOBAL macros.


    Workaround: Create an array with 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.
    )