索引超出了数组界限

qq_14995971 2016-06-14 11:14:00
通过点击comp来获得他的名字和坐标,然后把名字依次显示在textbox中,然后根据textbox中name的数量来确定b数组的行数,再计算textbox中name所对应的comp之间的距离,可是为什么提示 b[x][0] = matrix[0];索引超出了数组界限?求解
for (int i = 0; i < Selection.ItemCount; i++)
{
comp = (IvcComponent)Selection.getItem(i);
object name = comp.getProperty("Name");
double[] matrix = (double[])comp.RootNode.getProperty("WorldPositionMatrix"); //获得坐标xyz
if (textBox5.Text != "")
{
textBox5.Text += "->" + name.ToString();
}
else
{
textBox5.Text = name.ToString();
}
string[] tmp = textBox5.Text.Split("->".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); //得到拆分项
double sum = 0;
for (int x = 0; x < tmp.Length; x++)//根据拆分项确定行数
{
b[x][0] = matrix[0];
b[x][1] = matrix[1];
b[x][2] = matrix[2];
double xd = b[x][0] - b[x + 1][0];
double yd = b[x][1] - b[x + 1][1];
double zd = b[x][2] - b[x + 1][2];
sum += Math.Sqrt(xd * xd + yd * yd + zd * zd);
//listBox1.Items.Add("distance = " + sum);
}

}
...全文
340 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_14995971 2016-06-14
  • 打赏
  • 举报
回复
引用 3 楼 hanjun0612 的回复:
我纳闷的是,究竟
b[x]报错,还是matrix[1]报错。楼主要贴出你的错误断点
正怒月神 2016-06-14
  • 打赏
  • 举报
回复
我纳闷的是,究竟 b[x]报错,还是matrix[1]报错。楼主要贴出你的错误断点
xuzuning 2016-06-14
  • 打赏
  • 举报
回复
你在哪里检查了 b 的第一维长度 大于等于 tmp.Length 了? 既然没检查,就不能怪 b[x+1] 越界了
  • 打赏
  • 举报
回复
http://www.cnblogs.com/alexis/archive/2010/11/06/1870519.html 调试看看x的值是多少 或者matrix 。
qq_14995971 2016-06-14
  • 打赏
  • 举报
回复
引用 15 楼 lili20090907 的回复:
你先检查一下 b和matrix 的长度
x大于了b的总长度,该怎么改呢
qq_14995971 2016-06-14
  • 打赏
  • 举报
回复
引用 12 楼 xuzuning 的回复:
数组定义后据不能改变大小 既然你的 tmp 是可变长度的,不如将 b 定义成 List var b = new List<double[]>(); 另外 double xd = b[x][0] - b[x + 1][0]; 也有潜在的问题 前面刚对 b[x] 赋值,接下里就要取 b[x+1] 的值,显然是不对的
可以帮我改一下吗....
lili20090907 2016-06-14
  • 打赏
  • 举报
回复
你先检查一下 b和matrix 的长度
xuzuning 2016-06-14
  • 打赏
  • 举报
回复
可以,不过你有 double[] matrix = (double[])comp.RootNode.getProperty("WorldPositionMatrix"); //获得坐标xyz 那就要看 comp.RootNode.getProperty("WorldPositionMatrix") 实际返回的是什么了 只要别弄的太复杂就好
qq_14995971 2016-06-14
  • 打赏
  • 举报
回复
引用 12 楼 xuzuning 的回复:
数组定义后据不能改变大小 既然你的 tmp 是可变长度的,不如将 b 定义成 List var b = new List<double[]>(); 另外 double xd = b[x][0] - b[x + 1][0]; 也有潜在的问题 前面刚对 b[x] 赋值,接下里就要取 b[x+1] 的值,显然是不对的
那可以用结构体来完成吗,定义x,y,z
xuzuning 2016-06-14
  • 打赏
  • 举报
回复
数组定义后据不能改变大小 既然你的 tmp 是可变长度的,不如将 b 定义成 List var b = new List<double[]>(); 另外 double xd = b[x][0] - b[x + 1][0]; 也有潜在的问题 前面刚对 b[x] 赋值,接下里就要取 b[x+1] 的值,显然是不对的
qq_14995971 2016-06-14
  • 打赏
  • 举报
回复
引用 10 楼 hanjun0612 的回复:
引用 9 楼 qq_14995971 的回复:
[quote=引用 8 楼 hanjun0612 的回复:] b[x]的问题。
和楼上说的一样吗?
是的,简单来说就是x大于了b的总长度[/quote]那怎么定义啊,double[][] b = { };开头是这么写的
正怒月神 2016-06-14
  • 打赏
  • 举报
回复
引用 9 楼 qq_14995971 的回复:
引用 8 楼 hanjun0612 的回复:
b[x]的问题。
和楼上说的一样吗?
是的,简单来说就是x大于了b的总长度
qq_14995971 2016-06-14
  • 打赏
  • 举报
回复
引用 8 楼 hanjun0612 的回复:
b[x]的问题。
和楼上说的一样吗?
正怒月神 2016-06-14
  • 打赏
  • 举报
回复
b[x]的问题。
qq_14995971 2016-06-14
  • 打赏
  • 举报
回复
引用 5 楼 homesos 的回复:
应该是x超过了b的数组长度。 b的长度是在哪定的? tmp.Length是会变的,但没发现b的长度跟着变,除非b定义时就很长。
 double[][] b = { };
b当作一个全局变量来用的,怎么定义啊
qq_14995971 2016-06-14
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
你在哪里检查了 b 的第一维长度 大于等于 tmp.Length 了? 既然没检查,就不能怪 b[x+1] 越界了
那怎么办啊
homesos 2016-06-14
  • 打赏
  • 举报
回复
应该是x超过了b的数组长度。 b的长度是在哪定的? tmp.Length是会变的,但没发现b的长度跟着变,除非b定义时就很长。
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在C#开发中,“索引超出数组界限”是常遇的错误,通常源于访问数组元素时,所用索引超出数组合法范围。数组索引从0开始,一个包含n个元素的数组,其合法索引范围为0到n-1。若访问索引为n或更大元素,或负数索引,系统会抛出System.IndexOutOfRangeException异常。在“学生管理系统”项目里,该问题可能有以下原因:一是循环条件出错,像for或foreach循环终止条件设置过大,导致遍历数组或集合时越界。二是动态索引计算有误,运行时计算索引时,因逻辑错误使索引超出范围。三是数组未初始化,使用前未分配足够空间,尝试访问时会出错。四是存在null引用,若数组对象本身是null,访问时会抛异常,需确保使用前已正确实例化。五是多线程环境下,不同线程同时修改数组索引,可能使某线程在错误状态下访问数组,触发异常。六是下标硬编码错误,如数组长度9,却误写成10。解决方法有:一是审查代码,重点检查数组访问相关代码,尤其是循环和条件语句。二是借助Visual Studio等IDE调试工具,设断点观察变量值,定位异常行。三是添加异常处理代码,如try-catch块,捕获处理异常,获取详细错误信息。四是记录异常上下文信息,便于定位问题。五是编写单元测试,验证数组操作正确性,确保各种情况下都不越界。初学者要重视这些常见错误,理解并避免它们。在“学生管理系统”中,处理学生数据数组或列表时,要确保索引合法,增加、删除或查找学生信息时逻辑正确。若有代码,针对性分析更易找到问题。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧