首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数组索引循环开始,而不是内存访问错误

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

Stack Overflow用户
提问于 2021-11-21 17:29:21
回答 1查看 45关注 0票数 3

我目前正在开发一个视觉系统,它是通过我用C/C++编写的计算机应用程序来控制/监测的。如果你想知道我为什么用C/C++编写,基本上是因为我的视觉传感器(LMI Gocator 2490)有用C开发的函数,而且我正在使用opencv (C++)来分析它的数据。长话短说,我上过一门C语言的信息学课程,但我的C++水平很差。

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

代码语言:javascript
运行
复制
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访问冲突。我想要做的,是有某种机制,它会返回一个“循环”回到开始的数组索引。在上面显示的情况下,i=3的i+1将为0。如果我放入i+2,我希望得到1,依此类推...

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-21 17:33:12

当达到上限时使用模数进行包装

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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++中运行)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70056975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档