c++ - 数组索引循环开始而不是内存访问错误

标签 c++ arrays c loops indexoutofboundsexception

我目前正在开发一个视觉系统,该系统通过我用 C/C++ 编写的计算机应用程序进行控制/监控。如果您想知道我为什么用 C/C++ 编写,基本上是因为我的视觉传感器 (LMI Gocator 2490) 具有用 C 开发的功能,并且我正在使用 opencv (C++) 来分析其数据。长话短说,我上过 1 门 C 语言的信息学类(class),但我不擅长 C++。

我想知道是否有一种简单的方法,例如使用或编写一个函数来检索循环回到其开头的数组索引,而不是尝试在不属于数组的索引中读写这也会导致内存访问冲突。例如:

long a[4];

for (size_t i = 0; i < sizeof(a) / sizeof(long); i++)
{
    if (a[i] && a[i + 1]) //Define some conditions regarding a[i] and a[i+1]
    {
        //Process code
    }
}

所以在这里,很容易理解,当我达到值 3 时,我将遇到内存访问冲突。我想做的是拥有某种机制,它会返回一个“循环”回到开始的数组索引。在上面显示的情况下,i+1 其中 i = 3 将为 0。如果我要输入 i+2,我想得到 1,依此类推...

这可能很愚蠢,但它会让我省去在 for 循环内的某些 switch/case 语句中编写 4 次相同逻辑的痛苦,然后我需要在调试时对所有 4 个逻辑应用修改。 . 谢谢!

最佳答案

到达上限时使用模数回绕

long a[4];
size_t sz = sizeof(a) / sizeof(long);

for (size_t i = 0; i < sz; i++)
{
    if (a[i] && a[(i + 1) % sz]) //Define some conditions regarding a[i] and a[i+1]
    {
        //Process code
    }
}

虽然可能不是 super 优化的性能(好吧,值为 4,编译器可以用掩码交换模数,所以没问题)。

一般情况下,避免除法,检查是否超限,如果超限则选择0

for (size_t i = 0; i < sz; i++)
{
    size_t j = i < sz-1 ? i+1 : 0;
    if (a[i] && a[j]) //Define some conditions regarding a[i] and a[i+1]
    {
        //Process code
    }
}

(代码将在 C 和 C++ 中运行)

关于c++ - 数组索引循环开始而不是内存访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70056975/

相关文章:

c - 保护嵌入式设备的最佳实践

c++ - 如何在 0 个可变参数上专门化可变参数模板类?

java - 为什么不打印 "println"消息?

c - 多维数组的值为 "skipped"的奇怪错误

C:从函数外部访问指针

c - 头文件包含另一个头文件生成重新定义

c++ - boost 语言环境转换?

c++ - 函数级静态变量 NOT static 用于惰性簿记

c++ - Qt 与 OpenCv 不执行任何操作

C - 字符数组的数组