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

Array index loop to begin instead of mem access error

我目前正在开发一个视觉系统,它是 controlled/moonitored 通过我用 C/C++ 编写的计算机应用程序。如果您想知道我为什么要写 C/C++,那基本上是因为我的视觉传感器 (LMI Gocator 2490) 具有用 C 语言开发的功能,并且我正在使用 opencv (C++) 来分析其数据。长话短说,我上过 1 门 C 语言的信息学课程,但我不擅长 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 时,我将遇到 mem access violation。我想做的是拥有某种机制,该机制将 return 一个“循环”回到开始的数组索引。在上面显示的情况下,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
    }
}

虽然在性能方面可能不是超级优化(好吧,值为 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++)