TC官方合作论坛
标题:
由函数 数组指定位置删除 而发现的问题
[打印本页]
作者:
贪吃蛇
时间:
2015-5-16 10:32
标题:
由函数 数组指定位置删除 而发现的问题
本帖最后由 贪吃蛇 于 2015-5-16 17:05 编辑
先上代码:(谢谢
忆辰辅助
)
变量 a=数组("a"=0,"b"=1,"c"=2,"d"=3,"e"=4)
调试输出("原始数组="&a)
调试输出("原始数组大小="&数组大小(a))
变量 p=0
循环(a[p]!=null)
调试输出("a["&p&"]="&a[p]) //①
如果(p<3)
数组指定位置删除(a,p) //②
结束
p++
调试输出("p="&p&":数组"&a)
调试输出("p="&p&"数组a大小="&数组大小(a))
结束
调试输出("循环结束后,数组大小="&数组大小(a)&",数组="&a)
调试输出("以下为删除后的数组:")
遍历(变量 i = 0; i < 数组大小(a); i++)
调试输出("数组大小="&数组大小(a)&" a["&i&"]="&a[i])
结束
复制代码
输出结果:
1,输出>>"原始数组=array("0"=0,"1"=1,"2"=2,"3"=3,"4"=4)"
2,输出>>"原始数组大小=5"
3,输出>>"a[0]=0"
4,输出>>"p=0:数组array("1"=1,"2"=2,"3"=3,"4"=4)"
5,输出>>"p=0数组a大小=4"
6,输出>>"a[1]=1"
7,输出>>"p=1:数组array("1"=1,"3"=3,"4"=4)"
8,输出>>"p=1数组a大小=3"
9,输出>>"循环结束后,数组大小=4,数组=array("1"=1,"3"=3,"4"=4,"2"=)"
10,输出>>"以下为删除后的数组:"
11,输出>>"数组大小=4 a[0]="
12,输出>>"数组大小=5 a[1]=1"
13,输出>>"数组大小=5 a[2]="
14,输出>>"数组大小=5 a[3]=3"
15,输出>>"数组大小=5 a[4]=4"
之前我以为是
函数 数组指定位置删除 只删除值而非元素造成的,仔细分析原来我错了,
函数 数组指定位置删除 是删除了元素,问题的根本原因是TC5.1不支持数组下标。
分析:
定义数组时若不指定key,TC将自动生成从0开始的key
第3行,数组没变,下标与key一致;
第4、5行,删除位置0的元素后的数组,可见元素真的被删除了;
第6行,由a[1]=1可见,方括号[]内的不是下标,而是key!(以下用按key访问的格式描述)
第7、8行,删除位置1的元素后的数组,这里的“位置”才是TC4.x版所说的“下标”;
第9行,此时p=2,而a["2"]刚被删除,此时访问一个不存在的元素,TC就在数组的末尾自动增加了key="2"的元素,其值为null。循环到此结束。
第11行,这里又访问了不存在的数组元素a["0"],TC再次新增一个key=0,值=null的元素。
第12-15行,访问的数组元素都存在了。
结论:
TC5.1的数组实际上只有按key访问一种,所谓的按下标访问其实是通过自动生成的key访问数组,只不过格式上少了双引号""而已。
引发的问题:
因为TC数组摒弃了下标,首先是使用上不方便(特别是旧程序移植),而且没有“越界”检查,这时访问了错误的元素也不知道。
尽管数组通过key访问有其优势,但希望官方能保留数组的下标访问方式,并且帮助文档能有更详细的说明。
作者:
这论坛不错
时间:
2015-5-16 12:35
是有这个问题,应该是个BUG
你换种调试输出方法就不会这样了
变量 值,key,ret
遍历(变量 i=0;i < length;i++)
数组获取元素(b,i,值,key) //
ret="i"&" 值:"&值&" key:"&key
消息框(ret)
结束
作者:
忆辰辅助
时间:
2015-5-16 12:38
变量 a=数组(0,1,2,3,4)
调试输出(数组大小(a))
变量 p=0
循环(a[p]!=null)
调试输出("a["&p&"]="&a[p]) //①
如果(p<3)
数组指定位置删除(a,p) //②
结束
p++
调试输出(a)
调试输出(数组大小(a))
结束
调试输出(数组大小(a))
调试输出("以下为删除后的数组:")
遍历(变量 i = 0; i < 数组大小(a); i++)
调试输出(数组大小(a))
调试输出("a["&i&"]="&a[i])
结束
复制代码
用这段代码应该更能看出问题所在
作者:
kevinqq
时间:
2015-5-18 09:25
延续下标的使用方式很简单
你不设置key 数据就与原有的4.0的下标操作是一样的,内部的key是按4.0的下标方式默认生成的
作者:
贪吃蛇
时间:
2015-5-19 09:39
本帖最后由 贪吃蛇 于 2015-5-19 09:51 编辑
kevinqq 发表于 2015-5-18 09:25
延续下标的使用方式很简单
你不设置key 数据就与原有的4.0的下标操作是一样的,内部的key是按4.0的下标方 ...
创建数组时不设置key,默认生成的key与下标一致,key与对于的数组元素是绑定的,删除数组元素元素后,对应的key也不存在,此时再用此“下标”访问数组,则自动在数组尾部增加key为“下标”的空元素,所以,这“下标”不是4.x中的下标,而是数字形式的key。(详见下例)TC5.1中,只有 数组获取元素(arraygetat)中的”序号(index)“、数组指定位置删除(arraydeletepos)中的”位置(pos)“、数组增加元素(arrayadd)的”位置(index)“ 这几个函数参数是4.x的下标,其它的都是通过key访问数组,只不过key为数字时可省略双引号” “罢了。
变量 a=数组(0,1,2,3,4)
调试输出("原始数组="&a)//输出>>"原始数组=array("0"=0,"1"=1,"2"=2,"3"=3,"4"=4)"
数组指定位置删除(a,1)
traceprint("删除位置1后的数组="&a)//输出>>"删除位置1后的数组=array("0"=0,"2"=2,"3"=3,"4"=4)"
traceprint("\"下标\"1的元素="&a[1])//输出>>""下标"1的元素="
traceprint("访问后的数组="&a)//输出>>"访问后的数组=array("0"=0,"2"=2,"3"=3,"4"=4,"1"=)"
复制代码
欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/)
Powered by Discuz! X3.1