我正在遍历一个数组但是我在数组中的第一个和最后一个项目遇到了一些麻烦。
代码将arr[i]
与arr[i+1]
和arr[i-1]
进行比较。显然我希望索引将i-1
作为最后一个元素进行比较,但这会导致一个超出范围的数组索引。
当前循环:
(i=1; i<arr.size-1; i++)
if (arr(i-1,0)==2 || arr(i+1,0)==2)
{
do stuff
}
仅当i
从i=1
开始并循环到arr.size-1
时才有效。我怎么能绕过这个?
答案 0 :(得分:1)
要拥有循环索引,您可以将模数用作:( i
中的[0..array.size[
}
if (variable((i - 1 + arr.size()) % arr.size(), 0) == 2
|| variable((i + 1) % arr.size(), 0) == 2)
答案 1 :(得分:0)
要么为i == 0和i == arr.size-1添加显式检查,要么使用一些数学,如下所示:
if (variable(i>0?i-1:arr.size-1,0)==2 || variable((i+1)%arr.size,0)==2)
答案 2 :(得分:0)
没有办法解决这个问题。 您正在数组的限制下运行,并且必须确保不在元素所在的内存部分之外工作。
以下是一些应该说明主要连接的代码片段。
int i;
int a[ARR_MAX]; //a[0] to a[ARR_MAX-1]
for(i = 0; i < ARR_MAX; ++i)
{
a[i-1] //is an error if i is 0
a[i] //the usual way to access an array
a[i+1] //is an error if i is (ARR_MAX-1)
}
for(i = 1; i < (ARR_MAX-1); ++i)
{
a[i-1] //i does not start a 0
a[i+1] //i is never (ARR_MAX-1)
}
for(i = 0; i < ARR_MAX; ++i)
{
a[(i-1)%ARR_MAX] //is an error if i is 0
a[i%ARR_MAX] //is irrelevant in this loop
a[(i+1)%ARR_MAX] //is a[0] if i is (ARR_MAX-1)
}
for(i = 1; 1; ++i) // loops forever, i will get negative at some point
{
a[i%ARR_MAX]//can never be an error, unless i is negative
a[(i+n)%ARR_MAX]//can never be an error, unless i is negative
a[(i-n)%ARR_MAX]//is an error for n > i
}
应用于你的情况,我们可能只是提前启动和停止循环一个元素。 如果您能提供有关您的用例的详细信息,我将完善此声明。
答案 3 :(得分:-1)
如果数组中的元素位于i = 0..arr.size-1的位置,那么您可以使用以下内容:if ((i>0 && variable(i-1,0)==2) || (i<arr.size-1 && variable(i+1,0)))
。如果i> 0返回false,则甚至不会检查变量(i-1,0)== 2,因此它不会给你例外。