DATA Step, Macro, Functions and more

Dynamically define array using macro variable

Accepted Solution Solved
Reply
Contributor
Posts: 35
Accepted Solution

Dynamically define array using macro variable

Hi All,

I wanted to define an array with dynamic Dimension according the real data.  I create a macro variable &MAXCYC, and I checked, it had 25 in my program.  Now I want to define an array of &MAXCYC dimension with name as CYCLE_1-CYCLE_&MAXCYC.  I used the following format, but I got error message:

ARRAY CYC_N{&MAXCYC} CYCLE_1-CYCLE_&MAXCYC;

MESSAGE:

NOTE: Line generated by the macro variable "MAXCYC".

1     CYCLE       5

                  -

                  22

                  200

ERROR: Missing numeric suffix on a numbered variable list (CYCLE1-CYCLE).

ERROR: Too few variables defined for the dimension(s) specified for the array CYC_N.

ERROR 22-322: Syntax error, expecting one of the following: a name, (, ;, _ALL_, _CHARACTER_, _CHAR_, _NUMERIC_.

ERROR 200-322: The symbol is not recognized and will be ignored.

How do I solve this issue?

Thanks,

Abdu.


Accepted Solutions
Solution
‎08-03-2014 10:21 PM
Contributor dkb
Contributor
Posts: 53

Re: Dynamically define array using macro variable

Left-justify the macro variable when you create it - perhaps you used something like -

CALL SYMPUT('MAXCYC', PUT(n, 8.));

Use this instead:

CALL SYMPUT('MAXCYC', LEFT(PUT(n, 8.)));

Alternatively, left-justify when you invoke it:

ARRAY CYC_N{&MAXCYC} CYCLE_1-CYCLE_%LEFT(&MAXCYC);

View solution in original post


All Replies
Solution
‎08-03-2014 10:21 PM
Contributor dkb
Contributor
Posts: 53

Re: Dynamically define array using macro variable

Left-justify the macro variable when you create it - perhaps you used something like -

CALL SYMPUT('MAXCYC', PUT(n, 8.));

Use this instead:

CALL SYMPUT('MAXCYC', LEFT(PUT(n, 8.)));

Alternatively, left-justify when you invoke it:

ARRAY CYC_N{&MAXCYC} CYCLE_1-CYCLE_%LEFT(&MAXCYC);

Super User
Posts: 19,837

Re: Dynamically define array using macro variable

Call symputX instead of call symput

or trim the variable in your SQL step:

proc sql;

select trim(count(*)) into :max_count

from blah;

quit;

You can also consider the wildcard operators if you only have the variables in cycle_1 - cycle_5 starting with cycle_ in the dataset. If you have other variables such as cycle_max then this won't work.

array cyc_n(*) cycle_:;

🔒 This topic is solved and locked.

Need further help from the community? Please ask a new question.

Discussion stats
  • 2 replies
  • 758 views
  • 3 likes
  • 3 in conversation