【发布时间】:2016-01-18 13:01:58
【问题描述】:
我有一个经常被调用的函数。我有 3 个较小的数组,每个循环需要将它们打包成一个更大的数组
float* a;
float* b;
float* c;
float* abc;
a = calloc(1, sizeof(float)*3);
b = calloc(1, sizeof(float)*3);
c = calloc(1, sizeof(float)*3);
abc = calloc(1, sizeof(float)*9);
void update() {
for(int i = 0; i < 3; i++) {
fill_a(a);
fill_b(b)
fill_c(c);
abc[0] = a[0];
abc[1] = b[0];
abc[2] = c[0];
abc[0] = a[1];
abc[1] = b[1];
abc[2] = c[1];
abc[0] = a[2];
abc[1] = b[2];
abc[2] = c[2];
}
}
free(a);
free(b);
free(c);
free(abc);
上面的实现存在问题,因为这些值在后续循环中被覆盖。
我已经尝试为这样的值添加偏移量:
for(int i = 0; i < 3; i++) {
fill_a(a);
fill_b(b)
fill_c(c);
abc[(i*9)+0] = a[0];
abc[(i*9)+1] = b[0];
abc[(i*9)+2] = c[0];
虽然这似乎可行,但如果我尝试逐个添加也行不通。
我也尝试过通过索引值添加偏移量,但它计数到无穷大。
int idx = 0;
void update() {
for(int i = 0; i < 3; i++) {
fill_a(a);
fill_b(b)
fill_c(c);
abc[++idx] = a[0];
abc[++idx] = b[0];
abc[++idx] = c[0];
abc[++idx] = a[1];
abc[++idx] = b[1];
abc[++idx] = c[1];
我还尝试在一个 for 循环中填充第一个数组。然后稍后在更新循环中将这些值放入更大的数组中。
int idx;
idx = 0;
void update() {
for(int i = 0; i < 3; i++) {
fill_a(a);
fill_b(b)
fill_c(c);
}
int tidx = idx;
abc[++tidx] a[0];
abc[++tidx] b[0];
abc[++tidx] c[0];
....
idx = tidx;
}
但 idx 又跑到无穷大了。如何安排这个算法,以便我可以用较小数组中的值填充该循环内的较大数组,同时保持偏移量有序?
较大数组的值总是会在循环中被覆盖,因此在它被填充后,它会在其他地方使用,然后覆盖下一次更新调用。
编辑 我尝试过 gdb 调试,一次通过一个变量的代码。
预期的输出是这样的:
a = { 0, 1, 2 };
b = { -3, -2, -1 };
abc = { 0, -3, 11.
1, -2, 22 };
这是来自实际代码的完整工作示例。
int count = 3;
float* v_buff;
float* c_buff;
size_t vs = sizeof(float) * 6);
v_buff = calloc(1, (vs));
void update() {
for(int i = 0; i < count; i++) {
float a[3] = { 0, 1, 2}; //these will be new every update
float b[3] = { -3, -2, -1};
int idx = 0;
v_buff[++idx] = a[0];
v_buff[++idx] = a[1];
v_buff[++idx] = a[2];
v_buff[++idx] = b[0];
v_buff[++idx] = b[1];
v_buff[++idx] = b[2];
}
}
该示例代码可以编译,但同样适用。 尝试偏移:
v_buff[(i * 3) + (++idx)] = a[0];
使我的计数器运行到无穷大或只是覆盖 v_buff 中的第一组值。
【问题讨论】:
-
你已经做了哪些调试?预期产出和实际产出是多少?
-
看看第一个变体:有一个迭代变量——它在哪里被使用?
-
查看How to Ask 并提供minimal reproducible example。你不能在函数之外有语句。并避免使用全局变量。
-
您是否想将两个或多个数组合并成一个更大的数组?
-
注意:array[++idx] 会先增加 idx,然后再访问数组槽。
标签: c arrays algorithm for-loop