TC官方合作论坛

 找回密码
 立即注册
查看: 1444|回复: 4

[已解决] 由函数 数组指定位置删除 而发现的问题

[复制链接]
发表于 2015-5-16 10:32:38 | 显示全部楼层 |阅读模式

马上加入TC

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

x
本帖最后由 贪吃蛇 于 2015-5-16 17:05 编辑

先上代码:(谢谢 忆辰辅助)
  1.     变量 a=数组("a"=0,"b"=1,"c"=2,"d"=3,"e"=4)
  2.     调试输出("原始数组="&a)
  3.     调试输出("原始数组大小="&数组大小(a))
  4.     变量 p=0
  5.     循环(a[p]!=null)
  6.         调试输出("a["&p&"]="&a[p]) //①
  7.         如果(p<3)
  8.             数组指定位置删除(a,p) //②
  9.         结束
  10.         p++
  11.         调试输出("p="&p&":数组"&a)
  12.         调试输出("p="&p&"数组a大小="&数组大小(a))
  13.     结束
  14.     调试输出("循环结束后,数组大小="&数组大小(a)&",数组="&a)
  15.     调试输出("以下为删除后的数组:")
  16.     遍历(变量 i = 0; i < 数组大小(a); i++)
  17.         调试输出("数组大小="&数组大小(a)&" a["&i&"]="&a[i])
  18.     结束
复制代码

输出结果:
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-18 09:25:42 | 显示全部楼层
延续下标的使用方式很简单
你不设置key   数据就与原有的4.0的下标操作是一样的,内部的key是按4.0的下标方式默认生成的
回复 支持 反对

使用道具 举报

发表于 2015-5-16 12:35:05 | 显示全部楼层
是有这个问题,应该是个BUG
你换种调试输出方法就不会这样了
变量 值,key,ret
遍历(变量 i=0;i < length;i++)
数组获取元素(b,i,值,key) //
ret="i"&" 值:"&值&" key:"&key
消息框(ret)
结束
回复 支持 反对

使用道具 举报

发表于 2015-5-16 12:38:18 | 显示全部楼层
  1.     变量 a=数组(0,1,2,3,4)
  2.     调试输出(数组大小(a))
  3.     变量 p=0
  4.     循环(a[p]!=null)
  5.         调试输出("a["&p&"]="&a[p]) //①
  6.         如果(p<3)
  7.             数组指定位置删除(a,p) //②
  8.         结束
  9.         p++
  10.         调试输出(a)
  11.         调试输出(数组大小(a))
  12.     结束
  13.     调试输出(数组大小(a))
  14.     调试输出("以下为删除后的数组:")
  15.     遍历(变量 i = 0; i < 数组大小(a); i++)
  16.         调试输出(数组大小(a))
  17.         调试输出("a["&i&"]="&a[i])
  18.     结束
复制代码

用这段代码应该更能看出问题所在
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-19 09:39:31 | 显示全部楼层
本帖最后由 贪吃蛇 于 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为数字时可省略双引号” “罢了。
  1.     变量 a=数组(0,1,2,3,4)
  2.     调试输出("原始数组="&a)//输出>>"原始数组=array("0"=0,"1"=1,"2"=2,"3"=3,"4"=4)"
  3.     数组指定位置删除(a,1)
  4.     traceprint("删除位置1后的数组="&a)//输出>>"删除位置1后的数组=array("0"=0,"2"=2,"3"=3,"4"=4)"
  5.     traceprint(""下标"1的元素="&a[1])//输出>>""下标"1的元素="  
  6.     traceprint("访问后的数组="&a)//输出>>"访问后的数组=array("0"=0,"2"=2,"3"=3,"4"=4,"1"=)"
复制代码

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-6-2 18:37 , Processed in 0.034495 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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