TC官方合作论坛

标题: 数组调用超过越界,求解答 [打印本页]

作者: sspray    时间: 2012-2-8 22:22
标题: 数组调用超过越界,求解答
代码如下:功能   逻辑型  传送(string 原地图)//返回真为地图相符,假为不符
int x,y
int n=0,m=1,a=0,计数
string[]   Cmap=string[5]
string[][] map=string[4][7]

//曙光前哨站传送机能到达的地图,map[][0]用于判断传送机地图

map[0][0]="曙光前哨站"

map[0][1]="太阳城"

//太阳城传送机能到达的地图

map[1][0]="太阳城"
        map[1][1]="曙光前哨站"
        map[1][2]="迷雾湿地"
        map[1][3]="寂灭荒原"
        map[1][4]="巨龙谷"
        map[1][5]="叹息之地"
        map[1][6]="风暴城"
        //叹息之地传送机能到达的地图
        map[2][0]="叹息之地"
        map[2][1]="太阳城"
        map[2][2]="寂灭荒原"
        map[2][3]="巨龙谷"
        map[2][4]="陨石旷野"
        map[2][5]="风暴城"
        //风暴城传送机能到达的地图
        map[3][0]="风暴城"
        map[3][1]="太阳城"
        map[3][2]="叹息之地"
        map[3][3]="陨石旷野"
        map[3][4]="毒液废墟"
        map[3][5]="烈日血原"
        map[3][6]="极北口岸"

string 副地图,现地图=Dm.GetWords(865,6,974,24,"fcfcfc-202020",1.0)
        计数=Dm.GetWordResultCount(现地图)
        副地图=Dm.GetWordResultStr(现地图,计数-1)

help.messagebox(副地图)
if(str.strcompare(副地图,现地图)!=0)  //如果不是目标地图执行以下代码

while(n<4)
            while(str.strcompare(map[n][m]," ")!=0&& m<7 && str.strcompare(副地图,现地图)!=0)
                if(str.strcompare(副地图,map[n][m])==0)
                    Cmap[a]=map[n][m]
                    副地图=map[n][0]
                    help.messagebox(map[n][m])
                else

    m=m+1
                endif
            endwhile
            n=n+1
            m=1
        endwhile  
endif

返回  真
功能结束


程序运行后提示:数组调用超过越界



作者: 超自然    时间: 2012-2-8 22:49
:smoke8成访问到了mpa[n][7]了
步进调试看看就知道了
作者: sspray    时间: 2012-2-8 22:57
回复 2楼超自然的帖子

可能是一个平台的BUG,参数传送之后就出问题了
作者: sspray    时间: 2012-2-8 22:58
功能   逻辑型  传送(string 原地图)

我测试了下调用这个功能时,参数传给(string 原地图)后,比较两个竟然是不一样的,
作者: sspray    时间: 2012-2-8 23:20
回复 2楼超自然的帖子

你说的是正确的把下面7改成6就是正常的
while(str.strcompare(map[n][m]," ")!=0&& m<7 && str.strcompare(副地图,现地图)!=0)

但是那样运行好像map[n][6]直接是没办法比较,算不算平台的问题还有个问题就是n为什么不越界,二维数组的问题?

作者: 超自然    时间: 2012-2-9 11:59
:L不是什么7和6的问题,是你的wehile的问题,访问到了下标了
试试这样
string a=tring[3]
a[0]="eeeeee"
a[1]="QQQQQ"
a[2]="wwwww"
wehile (i<3)
i=i+1
help.messagebox(a[i-1])
endwhile
和这样
while (i<3)
help.messagebox(a)
i=i+1
endwhile

这两个你试试就会知道了
作者: sspray    时间: 2012-2-10 13:20
while只要条件是假就应该不会进行while内的运算才对,不关其他事,如果条件不符合还要传送到数组那就是平台的问题,
while (i<3)
help.messagebox(a)
i=i+1
endwhile
上面这个循环体内,只要wehile (i<3)不成立,就不应该去运行help.messagebox(a)这个代码才是对的,
i=3的时候,条件已经不成立,怎么可能去执行help.messagebox(a)这语句了,自然也应该没有a[3]这个超界的数组了,如果平台还去计算那肯定是平台的问题,
如果报错说明平台编写的代码有问题,应该他先去a是否越界,在去判断wehile (i<3)是否成立,顺序反了,至少在数组编写方面官方是有问题的

不过还是非常感谢你的回答,至少我的程序可以去运行了
作者: 超自然    时间: 2012-2-10 16:53
回复 7楼sspray的帖子

while (i<3)
help.messagebox(a)
i=i+1
endwhile
在最后一次运行,即1=3的时候,实际上就是访问了a[3]
而string[] a=string[3]
只有
a[0]
a[1]
a[2]
三个元素,因此程序会在此报错,报数组越界

while (i<3)
i=i+1
help.messagebox(a[i-1])
endwhile
当i=3的时候实际是访问的a[2],因此不会越界
作者: sspray    时间: 2012-2-10 18:20
回复 8楼超自然的帖子

问题出来了:
如果i=3的话,while()条件已经不成立,为什么要去解析while()循环体内的语句help.messageBox()呢?
作者: 超自然    时间: 2012-2-10 18:50
回复 9楼sspray的帖子

这问题我跟老大说过,后来忙,也没跟进
while (1<b)
照我的理解,不应该走到i=b
可实际上,会走到i=b才停止,因为while本身无法判断下一步是不是绝对<b,所以只能到=b的时候才停
作者: sspray    时间: 2012-2-10 19:11
回复 10楼超自然的帖子

我的理解
实际上,会走到i=b才停止,while()运行的时候应该是判断i=b的时候就不进行循环体内的代码,
至少C还是VC++都是这么判断的,所以我觉得应该是TC在数组这块代码没写好,没有判断到各种特殊情况

写了两天代传送,早上都已经完全运行OK了,下午在调用又是这个问题,感觉无助,超级郁闷,




欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1