楼主: fisheryou
6650 16

[问答] 关于坛子中CALL EXECUTE()用法产生的疑惑 [推广有奖]

11
zhou.wen 发表于 2013-9-11 15:21:08
pobel 发表于 2013-9-11 15:07
我对你提到的缓存机制不懂,希望有高手可以为你解惑。

我的疑问是:你的%main在第二次运行的成功与否应 ...
第二次是否运行成功与e的存在有关系,peeklong函数的作用就是获取内存地址&e中的值
但是很奇怪,加了这句,第二次也不能运行了
求解原因?
Practice Is The Best Teacher!

12
pobel 在职认证  发表于 2013-9-11 15:33:58
zhou.wen 发表于 2013-9-11 15:21
第二次是否运行成功与e的存在有关系,peeklong函数的作用就是获取内存地址&e中的值
但是很奇怪,加了这句 ...
没有%let那句时,data b所创建的宏变量e会被存到global symbol table中。而在%main运行完毕后,宏变量e不会被删除。

而有%let语句时,%main执行时会创建一个local symbol table用在存放这个宏里产生的宏变量,当宏执行完毕后这个local symbol talbe就会被删除。

这也和call symputx()有关,如果将call symputx的第三个参数的值设为‘G’,那产生的宏变量就直接存到global symbol table了
已有 1 人评分学术水平 热心指数 收起 理由
zhou.wen + 1 + 1 受教了,不过那个内存地址分配的问题我还是.

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

和谐拯救危机

13
kuhasu 发表于 2013-9-12 20:31:24
dosubl就当是call execute的函数即执行版就行了
以前问过sas官方一个问题,关于编译的,就是call execute是在run后编译的问题,导致一些代码无法实现预期效果。然后他们新加了这个,但是似乎还是有局限性的。
call symputx函数赋值,如果你不‘’,应该是可以解析的,‘’之后就为编译后执行解析,试试看“”,是编译解析。
另外peeklong早就有,但是太过复杂,以前是用来执行外部dll用,而且64的系统好复杂~

14
zhou.wen 发表于 2013-9-13 10:12:07
kuhasu 发表于 2013-9-12 20:31
dosubl就当是call execute的函数即执行版就行了
以前问过sas官方一个问题,关于编译的,就是call execute是 ...
受教了,不过现在我还是有个疑问,关于下面这段程序的。data a中y与y1都可以正确显示成123456,但是dosubl里的y1就不能了,如果说dosubl是execute的执行班,那理论上在执行data b的过程中变量a的内存空间应该是保留的。data b中的y1应该也可以为123456.
但是从结果来看,data b执行出错了,我想到两种解释:1.dosubl的执行是在data a中的y1赋值之后执行
2.执行dosubl时,内存环境已经被破坏了
两种解释我都觉得不是很合理,希望kuhasu大神给个合理的解释
data a;
a = 123456;
e=addrlong(a);
call symput('e',e);
x=peekclong(e,8);
y=input(x,rb8.);
rc=dosubl("
data b;
b=symget('e');
x1=peekclong(b,8);
y1=input(x1,rb8.);
run;
");
b=symget('e');
x1=peekclong(b,8);
y1=input(x1,rb8.);
run;
Practice Is The Best Teacher!

15
jingju11 发表于 2013-9-13 10:33:26
诸位是对sas赶鸭子上架啊。或许,唯一的原因很可能只是鸭子太笨,而诸位太聪明了。京剧

16
kuhasu 发表于 2013-9-16 23:04:08
八成跟peeklong模式有关?

17
kuhasu 发表于 2013-9-16 23:04:36
另外这种问题好像一直比较复杂,需要很牛的IT背景才行

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 17:10