我如何用 C 中的循环解决这个问题?

How can I solve this problem with loops in C?

大家好,我有个问题解决不了,可能是小事!

我需要用循环自动执行这段代码:

                array[1]=arrayPayload[0].bytes[0];
                array[2]=arrayPayload[0].bytes[1];
                array[3]=arrayPayload[0].bytes[2];
                array[4]=arrayPayload[0].bytes[3];
                array[5]=arrayPayload[1].bytes[0];
                array[6]=arrayPayload[1].bytes[1];
                array[7]=arrayPayload[1].bytes[2];
                array[8]=arrayPayload[1].bytes[3];

我试过这个解决方案,但显然它不起作用,因为索引没有正确滚动!

    for(x=1 ; x < 9 ; x++){
        for(u=0 ; u < 2 ; u++){
            for(z=0 ; z < 4 ; z++){
                array[x] = arrayPayload[u].bytes[z];
            }
        }
    }

如果你能帮助我,在此先感谢!!

移除最外层的循环并改为从两个内部计数器计算数组索引:

array[u * PAYLOAD_SIZE/BYTE_NUMBER + z + 1]

或者,总体上更简单的方法是让 一个 循环并从 0 计数到 PAYLOAD_SIZE 排除,然后从该计数器计算其余部分:

array[i + 1] = arrayPayload[i / BYTE_NUMBER].bytes[i % BYTE_NUMBER]
int x,y,z;
for(x=1 ; x < 9 ; x++){
  y= (x-1) / 4;
  z= (x-1) % 4;
  array[x] = arrayPayload[y].bytes[z];  
}

这有点棘手,因为指标排列不当(x 领先一步)。 但是你可以很容易地用除法和模数 4 来做到这一点。

当你通过一个数组 array 时,你只需要一个循环,其余的取决于数组中的位置,所以你应该使用 x 作为其余部分的参考。

也许更容易阅读,编译器将其更改为:

int x;
for(x=0 ; x < 8 ; x++){
  const int y= x / 4;
  const int z= x % 4;
  array[x+1] = arrayPayload[y].bytes[z];  
}

每次赋值后都需要 x+1,因此将 x 增量放在最外层循环没有意义。

    x=1;
    for(u=0 ; u < 2 ; u++){
        for(z=0 ; z < 4 ; z++){
            array[x++] = arrayPayload[u].bytes[z];
        }
    }

正确的解决方案使用 KISS principle(而不是“让它愚蠢地复杂化”)。始终使循环尽可能简单。从零迭代到已知值。不要在不需要时使用多个迭代器。

for(size_t i=0; i<4; i++)
{
  array[i+1] = arrayPayload[0].bytes[i];
}
for(size_t i=0; i<4; i++)
{
  array[i+5] = arrayPayload[1].bytes[i];
}

如果可能,将“幻数”换成有意义的命名常量。我不知道这些数据是什么,但生产质量代码看起来类似于:

for(size_t i=0; i<SET_SIZE; i++)
{
  array[i+OFFSET0] = arrayPayload[SET0].bytes[i];
}
for(size_t i=0; i<SET_SIZE; i++)
{
  array[i+OFFSET1] = arrayPayload[SET1].bytes[i];
}

你的“问题”是 x 在外循环中递增,所以你得到:

x u z
-----
1 0 0
1 0 1
1 0 2
1 0 3
1 1 0
1 1 1
1 1 2
1 1 3
1 0 0
2 0 1
2 0 2
2 0 3
2 1 0
2 1 1
2 1 2
2 1 3
...
8 0 0
8 0 1
8 0 2
8 0 3
8 1 0
8 1 1
8 1 2
8 1 3

所以 array 的所有元素最终都等于 arrayPayload[1].bytes[3]

只需删除外层循环并在每次赋值后递增 x

如果所有变量 arrayarrayPayloadbytes 都是数组(即其中 none 是指针)你应该这样做:

#define ARRAY_OFFSET 1
#define ELM_ARRAY (sizeof array / sizeof array[0])
#define ELM_PAYLOAD (sizeof arrayPayload / sizeof arrayPayload[0])
#define ELM_BYTES (sizeof arrayPayload.bytes / sizeof arrayPayload[0].bytes[0])


// Optional assert to make sure 'array' size is ok
assert(ELM_ARRAY >= (ELM_PAYLOAD * ELM_BYTES + ARRAY_OFFSET);

x = ARRAY_OFFSET;
for (size_t i = 0; i < ELM_PAYLOAD; ++i)
{
    for (size_t j = 0; j < ELM_BYTES; ++j)
    {
        array[x] = arrayPayload[i].bytes[j];
        ++x;
    }
}

根据实际数组大小计算循环条件将使您的代码更易于维护,以防其中一个数组更改大小。

如果 arrayarrayPayloadbytes 中的一个或多个是指针,您应该给出元素的数量 - 从而给出循环条件 - 使用定义,例如#define ELM_PAYLOAD 2

使用 memcpy 的替代方法:

#define ARRAY_OFFSET 1
#define ELM_ARRAY (sizeof array / sizeof array[0])
#define ELM_PAYLOAD (sizeof arrayPayload / sizeof arrayPayload[0])
#define SZ_BYTES_ELEMENT (sizeof arrayPayload[0].bytes[0])
#define ELM_BYTES (sizeof arrayPayload.bytes / SZ_BYTES_ELEMENT)

// Optional assert to make sure 'array' size is ok
assert(ELM_ARRAY >= (ELM_PAYLOAD * ELM_BYTES + ARRAY_OFFSET);

for (size_t i = 0; i < ELM_PAYLOAD; ++i)
{
    memcpy(array + i * ELM_BYTES + ARRAY_OFFSET, 
           arrayPayload[0].bytes, 
           ELM_BYTES * SZ_BYTES_ELEMENT);
}

这是一个可能的解决方案

 for(int i = 1 ; i < 9; i++) {
        array[i] = arrayPayload[(i-1)/4].byte[(i-1) -(((i-1)/4) * 4)];
    }