schuhi 发表于 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个元素了,进行计算,发现可以计算过去。
为什么?

schuhi 发表于 2014-3-27 14:27:32

另外,假如将数组eorder1和eorder2设置成1列500行的数组,也能解决问题。

朱测 发表于 2014-3-27 19:43:02

不知道楼主有没有用到循环,如果在循环里面赋值要小心。
我以前用*do循环遇到过类似问题,具体的忘了。贴上相关代码,我可以帮你看看。

schuhi 发表于 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)
页: [1]
查看完整版本: 【讨论】数组溢出