pobel 发表于 2013-9-11 14:30 
如果dosubl()中直接引用宏变量‘&e’
第一次运行会报错是因为:call symputx()所产生的宏变量e需要到d ...
补充一下,前面我写代码也应该是比较好理解的,但是外部嵌套宏之后,宏的编译应该在data之前
因此,第一次运行%main;的时候宏变量e没有赋值,所以出错,但是第二次运行%main;后宏变量e已经赋了值,所以第二次运行结果正确
这里还有个小问题,宏变量e赋的是data b中变量a(1)的内存地址,我一开始理解data步结束后内存地址会释放,也就是说下次运行data b步的时候a(1)的地址应该有变化才对
但是从结果来看,第二次运行%main;宏变量e正确的取到了a(1)的内存地址,也就是说第二次运行data b的时候,虽然数据集是重新生成的,但是给变量a(1)分配的内存地址跟第一次运行相比并没有改变。于是我猜测可能是sas内部有缓存机制
下面做一些实验:
option nonotes nosource;
%put Firt Time Run:data a address is;
data a;
b=1;c=2;
add=addrlong(b);
put add hex16.;
run;
%put Firt Time Run:data a1 address is;
data a1;
x=1;y=1;z=2;
add=addrlong(x);
put add hex16.;
run;
%put Second Time Run:data a address is;
data a;
b=1;c=2;
add=addrlong(b);
put add hex16.;
run;
结果为:
Firt Time Run:data a address is
0881AA0C00000000
Firt Time Run:data a1 address is
3881AA0C00000000
Second Time Run:data a address is
0881AA0C00000000
可以猜测提交过的代码在,在sas中有缓存,所以相同的变量的内存地址没有发生变化,这样也就解释了为什么第二次运行%main;可以成功。
上面的大部分内容为个人理解,希望各路大神拍砖。