问题描述
_et=newList<List<edge>>(ymax-ymin+1);for(inti=0;i<_et.Count;i++){_et[i]=newList<edge>();}//边的分类表else{intj=(int)(_segments[i].p1.Y-ymin);edgeed=newedge();ed.x=_segments[i].p1.X;ed.deltax=(_segments[i].p2.X-_segments[i].p1.X)/(_segments[i].p2.Y-_segments[i].p1.Y);ed.ymax=(int)_segments[i].p2.Y;_et[j].Add(ed);}}定义了一个边的分类表,扫描线算法里的,当运行的最后一步时总提示索引超出范围.必须为非负值并小于集合大小,请大神解答啊,不知道怎么处理。。。
解决方案
解决方案二:
你贴的代码都看不懂,else上面居然是个for。这个错误提示的已经很明显了,数组索引超范围了,自己去定位错误在哪里吧
解决方案三:
不好意思啊,因为想尽量简洁一点,就把与这个问题无关的代码删除了,其实是这样的:_et=newList<List<edge>>(ymax-ymin+1);for(inti=0;i<_et.Count;i++){_et[i]=newList<edge>();}for(inti=0;i<_segments.Count;i++){if(_segments[i].p1.Y==_segments[i].p2.Y){_horizonEdge.Add(_segments[i]);}//边的分类表else{intj=(int)(_segments[i].p1.Y-ymin);edgeed=newedge();ed.x=_segments[i].p1.X;ed.deltax=(_segments[i].p2.X-_segments[i].p1.X)/(_segments[i].p2.Y-_segments[i].p1.Y);ed.ymax=(int)_segments[i].p2.Y;_et[j].Add(ed);}}我list和list里的list都初始化了,list也定义了容量,为什么还是会超范围?ymax和ymin都是_segments[i].p1.Y的最大最小值,不应该超啊。。。
解决方案四:
调试下,看看走到哪步报错
解决方案五:
错误应出现在_et[j].Add(ed);请在这之前检查j的值
解决方案六:
_et[j]中的j是不是会比_et.Coun大?
解决方案七:
很明显,你的程序有问题啦。I超出了数组的访问
解决方案八:
抛出异常时,在vs上调试,查看“调用堆栈”的深入的1、2层的调用环境的代码位置和变量值。这些应该是一个正规程序员自己做、必备的知识。如果你调试知识等于零,然后求人给改bug,这就是在那种极端不正规的公司里,也应该是先请人家吃饭的。
解决方案九:
你看看你的_et的count与你_seg的count的大小关系
解决方案十:
下面只是猜测intj=(int)(_segments[i].p1.Y-ymin);
是不是_et[j]的问题?_et数组可能没这么长_et[j].Add(ed);
解决方案十一:
j大于_et个数