找回密码
 注册
Simdroid-非首页
查看: 59|回复: 5

【讨论】数组溢出

[复制链接]
发表于 2014-3-26 14:07:31 | 显示全部楼层 |阅读模式 来自 陕西西安
在进行焊接生死单元模拟的时候,第一次设定了两个数组,eorder1和eorder2,这两个数组均是1列250行,里面的单元是按照一定顺序排列的。输入命令流后进行计算,出现如下错误“subscript range error. parameter eorder2 is dimensioned as 250,but location 251 is being requested”.


这个错误的意思是我设定的eorder2的范围时250,但是实际数据的范围超过250了。但是我明明每个数组均是设定了250个位置啊,两个数组是独立的啊。难道eorder2是接着eorder1进行排列的?
我试试找问题,这次我把eorder1和eorder2分别拆分成5个数组,每个也就是50个元素了,进行计算,发现可以计算过去。
为什么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2014-3-27 14:27:32 | 显示全部楼层 来自 陕西西安
Simdroid开发平台
另外,假如将数组eorder1和eorder2设置成1列500行的数组,也能解决问题。
回复 不支持

使用道具 举报

发表于 2014-3-27 19:43:02 | 显示全部楼层 来自 浙江杭州
不知道楼主有没有用到循环,如果在循环里面赋值要小心。
我以前用*do循环遇到过类似问题,具体的忘了。贴上相关代码,我可以帮你看看。
回复 不支持

使用道具 举报

 楼主| 发表于 2014-3-28 08:16:58 | 显示全部楼层 来自 陕西西安
朱测 发表于 2014-3-27 19:43
不知道楼主有没有用到循环,如果在循环里面赋值要小心。
我以前用*do循环遇到过类似问题,具体的忘了。贴上 ...

原先的550是用wnum1和wnum2代替的,但是换了550之后,问题就解决了
CMSEL,S,SHANG1-1
CMSEL,a,SHANG2-1
*get,wnum1,elem,,count   
*dim,eorder1,,550  
*dim,ne1,,wnum1   
*dim,nex1,,wnum1  
*get,emax1,elem,,num,max
*get,emin1,elem,,num,min
*SET,mine1,0
*SET,ii,0   
*do,i,emin1,emax1
*if,esel(i),eq,1,then   
*SET,ii,ii+1
*SET,ne1(ii),i   
*endif  
*enddo  
*do,i,1,wnum1
*get,nex1(i),elem,ne1(i),cent,z  
nex1(i)=abs(nex1(i))
*enddo  
*do,i1,1,wnum1   
*SET,minx1,10e10
*do,i,1,wnum1
*if,nex1(i),lt,minx1,then
*SET,minx1,nex1(i)
*SET,mine1,ne1(i)
*SET,j,i
*else   
*if,nex1(i),eq,minx1,then
*SET,minx1,nex1(i)
*SET,mine1,ne1(i)
*SET,j,i
*endif  
*endif  
*enddo  
*SET,eorder1(i1),mine1
*SET,nex1(j),10e10
*enddo
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!di2ceng
alls
CMSEL,S,SHANG1-2
CMSEL,a,SHANG2-2   
*get,wnum2,elem,,count   
*dim,eorder2,,550   
*dim,ne2,,wnum2  
*dim,nex2,,wnum2  
*get,emax2,elem,,num,max
*get,emin2,elem,,num,min
*SET,mine2,0
*SET,ii,0   
*do,i,emin2,emax2
*if,esel(i),eq,1,then   
*SET,ii,ii+1
*SET,ne2(ii),i   
*endif  
*enddo  
*do,i,1,wnum2
*get,nex2(i),elem,ne2(i),cent,z  
nex2(i)=abs(nex2(i))
*enddo  
*do,i1,1,wnum2   
*SET,minx2,10e10
*do,i,1,wnum2
*if,nex2(i),lt,minx2,then
*SET,minx2,nex2(i)
*SET,mine2,ne2(i)
*SET,j,i
*else   
*if,nex2(i),eq,minx2,then
*SET,minx2,nex2(i)
*SET,mine2,ne2(i)
*SET,j,i
*endif  
*endif  
*enddo  
*SET,eorder2(i1),mine2
*SET,nex2(j),10e10   
*enddo
回复 不支持

使用道具 举报

发表于 2014-3-28 12:55:50 | 显示全部楼层 来自 中国
楼主,你的代码我好像在哪儿看过,选一个热源区域,然后选取热源区域内的单元并排序,然后设置每个单元的载荷。
你的程序我把wnum1、wnum2设置成550,然后建数组没有问题。帮不到楼主了,我也没心看整段代码,但是建议楼主这么做。
先执行这段代码前的程序,确保前面没问题,然后执行
CMSEL,S,SHANG1-1
CMSEL,a,SHANG2-1
*get,wnum1,elem,,count   
·
·
·
*SET,eorder1(i1),mine1
*SET,nex1(j),10e10
*enddo
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!di2ceng
这一段。如果是你描述的溢出问题,这一段应该就会有,不用等到eorder2,然后再排查每行代码吧。我执行了没有问题,但是因为没有建模所有没有单元可选,eorder1为全零数组,又不想看整段代码···所以帮不到楼主了。
回复 不支持

使用道具 举报

发表于 2014-3-28 13:14:12 | 显示全部楼层 来自 上海
额,又试了一下,还是没问题···我又看了一下错误,“···location251 is being requested"建议楼主找出是哪一行代码处出现了这个error,有可能是楼主调用eorder2中的值时,eorder(i)中的i超过250了。另外,这两个数组名字不一样,肯定是独立的
我输入这样一段代码才会出现跟楼主一样的错误,道理很简单,楼主一看就知道了,但估计你代码里的错误页类似,只不过代码太多乱了。
n=10
*dim,pn,array,n
*do,i,1,n,1
  pn(i)=i
*enddo
*status,pn
errorhere=pn(i+1)
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-1 13:22 , Processed in 0.031049 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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