1

我正在构建一组数组,其中每个元素都依赖于前一个元素,我很难想出一个优雅的解决方案来设置初始值。代码看起来像这样:

int A[1024];
int B[1024];
/* ... more arrays... */
int i;
for (i = 0; i < 1024; i++) {
    /* do some work */
    A[i] = A[i-1] + some_value();
    B[i] = B[i-1] + some_other_value();
    /* ... and so on... */
}

但是当为 0 时当然是无效的内存访问。i我知道所有数组的初始值都应该为 0。

有几种方法可以解决这个问题。if我可以在循环中放置一个巨大的语句来检查是否i为 0。看起来很笨重,因为它只会计算true一次。我可以为每个名为 的数组保留一个初始化为 0 的临时变量,以prev_val_of_A保存最后一次迭代的值。我必须在每次迭代结束时将其更新为当前值。这似乎有点傻,因为大多数时候,我想要的值就在数组的前一个元素中。我可以摆弄数组的含义,并采用数组中的第二个元素包含循环第一次迭代的值的约定;也就是说,分配 for A[1025],初始化A[0],然后在循环中,做

A[i+1] = A[i] + some_value();

这似乎令人困惑,并且可能会在进一步使用A.

我正在寻找干净、优雅的建议来解决这个问题。

4

3 回答 3

2

解决这个问题的最简单方法是初始化A[0]B[0],然后从i = 1. IE

int A[1024];
int B[1024];
/* ... more arrays... */
int i;

A[0] = stuff();
B[0] = other_stuff();
/* etc */

for (i = 1; i < 1024; i++) {
    /* do some work */
    A[i] = A[i-1] + some_value();
    B[i] = B[i-1] + some_other_value();
    /* ... and so on... */
}

编辑:这是相当优雅的,因为它反映了数学:序列通常由 定义f(0) = xf(n) = <stuff with f(n-1)>如果 n > 0)

于 2012-04-04T13:45:15.167 回答
0

以下情况如何:

int AX[1024+1];
int BX[1024+1];
int *A = AX+1, *B = BX+1;
AX[0] = 0;
BX[0] = 0;

/* ... more arrays... */
int i;
for (i = 0; i < 1024; i++) {
    /* do some work */
    A[i] = A[i-1] + some_value();
    B[i] = B[i-1] + some_other_value();
    /* ... and so on... */
}
于 2012-04-04T13:46:04.850 回答
0

从概念上讲,您的数组被定义为初始值和递归关系。所以只需在循环外初始化你的第一个元素,然后用循环计算下一个值。我不明白为什么它会不漂亮。

于 2012-04-04T13:46:19.057 回答