You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

索引缓冲区越界问题:如何循环获取面索引数组中的每个索引?

解决面索引数组循环越界的问题

这个问题我之前处理过,核心是循环的终止条件和步长设置都有问题,导致了越界访问。咱们一步步来理清楚:

先说说原代码的问题

你现在的循环是for (int n = 0 ; n < updatedIndices.size(); n++),这里有两个明显的问题:

  1. 终止条件不对:当n走到updatedIndices.size()-1时,n+1就等于数组的长度了,但数组的索引范围是0到size()-1,这时候访问updatedIndices[n+1]直接越界,触发崩溃。
  2. 步长不对:你每次要取3个连续索引组成三角形,但n++会导致下一次循环重复处理前一组的后两个元素(比如n=0处理0/1/2,n=1又处理1/2/3),这显然不是你要的分组逻辑。

正确的解决方法

方法1:修正循环的终止条件和步长

直接调整循环,让n每次跳3步,同时确保n+2不会超出数组范围:

// 先判断数组长度是否是3的倍数,避免残留无法组成三角形的索引
if (updatedIndices.size() % 3 != 0) {
    std::cerr << "Warning: 索引数组长度不是3的倍数,无法全部组成三角形!" << std::endl;
    // 这里可以根据需求加错误处理,比如return或者抛出异常
}

// 循环每3个索引一组处理
for (int n = 0; n < updatedIndices.size() - 2; n += 3) {
    int n0 = updatedIndices[n];
    int n1 = updatedIndices[n+1];
    int n2 = updatedIndices[n+2];
    manual->triangle(n0, n1, n2);
}

这里n += 3保证每次处理一组全新的3个索引,而n < updatedIndices.size() - 2确保n+2最大是updatedIndices.size()-1(当n=size()-3时),刚好是数组最后一个元素的索引,不会越界。

方法2:用迭代器遍历(适合std::vector)

如果你的updatedIndices是std::vector类型,用迭代器的写法会更直观,也能避免索引计算的错误:

for (auto it = updatedIndices.begin(); it != updatedIndices.end(); ) {
    // 检查剩余元素是否足够组成一个三角形
    if (std::distance(it, updatedIndices.end()) < 3) {
        break;
    }
    int n0 = *it;
    int n1 = *(++it);
    int n2 = *(++it);
    manual->triangle(n0, n1, n2);
    ++it; // 移动到下一组的起始位置
}

这种写法不需要手动计算索引,通过迭代器的移动来分组,同样能保证不会越界。

额外提醒

一定要确保你的面索引数组的长度是3的倍数,不然最后会剩下1-2个无法组成三角形的索引,提前做判断能避免后续的逻辑错误哦。

内容的提问来源于stack exchange,提问作者andre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:41:27