SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1513|回复: 6
打印 上一主题 下一主题

method中的do循环问题!

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2003-12-4 23:23:18 | 只看该作者

method中的do循环问题!

在一个class的method中使用do循环(形如 do i=1 to 100),运行时总是出现死循环的现象,程序毫无问题,在frame的scl中运行完全正常。如果将上述循环形式改为 do while(i<=100) 的形式,功能又能正常执行。

不知是什么缘故?难道class中不能存在针对其属性(i 须是class的某个属性方能如此使用)的do循环(形如 do i=1 to 100 的形式)吗?但为何do wile(i<=100)的形式可以正常运行呢?请各位不吝赐教。谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2003-12-5 09:34:14 | 只看该作者
i只能算是一个method的局部变量,不能算这个class的attribute。

我觉得一般不能出现这种问题,可能不是do...end的问题,而是其他的一些问题。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2003-12-5 11:24:01 | 只看该作者
在class的method中使用的所有变量必须是class的属性或method的参数,我曾试过违反此规则的操作,系统信息提示我应遵守上述规则。因此do循环中使用的循环变量我也设为class的属性之一,这样就出现了上述的问题。

具体问题就是循环变量增加到一定数值时就无法再自动增加(在我的程序中总是停留在i=2上),从而永远无法跳出循环。

还请各位高手指点。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2003-12-5 11:26:09 | 只看该作者
无论i是method内部的局部变量,还是class的attribute,我也觉得不太可能出现这种情况,多数还是你程序逻辑问题。
建议没有必要把i这种只用于循环的变量设成attribute,因为变成全局的就可能发生被其他method修改的可能了。

你有没有在method中
dcl num i;

实在有问题,做个小demo,发给大家研究一下。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2003-12-5 14:56:22 | 只看该作者
[quote="shiyiming":67f93]无论i是method内部的局部变量,还是class的attribute,我也觉得不太可能出现这种情况,多数还是你程序逻辑问题。
建议没有必要把i这种只用于循环的变量设成attribute,因为变成全局的就可能发生被其他method修改的可能了。

你有没有在method中
dcl num i;[/quote:67f93]

但为什么改为do while(i<=n) 后能正常运行?我的程序逻辑应当没有问题,检查了好多遍。

我没有在method中使用dcl num i;而是在class中使用 private num i;
是不是这样导致的问题?我改成前一个形式试一试。

谢谢shiyiming兄的指点!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2003-12-5 15:56:28 | 只看该作者
这可能还是你那边的问题。
我试了一下:
我定义个一个class名称为d,有个private的num:i
并新建以一个method:willon
/* WILLON */                  
WILLON: public method  return=num;
    dcl num result;            
    result=0;                  
    do i=1 to 10;              
       result=result+i;        
    end;                       
    return result;            
endmethod;

然后调用这个class运行,一点问题都没有,结果显示正常。

init:     
   dcl num result;   
   import work.new.d.class;      
   dcl d d=_new_ d();            
   result=d.willon();            
   d._term();        
   put result;      
return;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2003-12-5 19:57:12 | 只看该作者
试了试你的程序,没有任何问题。看来还是我的程序存在问题,我好好检查一下。

谢谢willon!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-1-7 12:10 , Processed in 0.144200 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表