【问题标题】:Updating struct members in a for-loop在 for 循环中更新结构成员
【发布时间】:2020-08-15 22:14:18
【问题描述】:

有没有办法在 for 循环中更新结构成员,我想避免一个一个地更新成员。例如:

不要这样做:

void Update(int vaule,struct Coolstruct *Ice)
{
    int vaule;
    Ice->member1=vaule;
    Ice->member2=vaule;
    Ice->member3=vaule;
    Ice->member4=vaule;
}

我想知道类似的东西(伪代码)是否可能:

void Update(int vaule,struct Coolstruct *Ice)
{
    int vaule;

    for(int i=0;i++;i<4)
    {
        Ice->i =vaule
    }
}

【问题讨论】:

  • 这就是数组的用途。
  • 你可以修改你的结构定义,用一个数组来替换分隔的member,但是初始化不能是修改它的唯一原因,这一定是有意义的。警告,在 Update 中,您通过具有相同名称且未初始化的变量来屏蔽参数 vaule,行为未定义
  • struct Coolstruct { int member[4]; };
  • for(int i=0;i++;i&lt;4) 不符合您的预期。
  • (a) 不要这样做。别再尝试了。 C 没有为此提供适当工具的原因是它不是必需的,并且有更好的方法来实现您的实际目标。 (b) 如果要将成员作为数组访问,则应将它们定义为数组。单独访问数组的元素(例如Ice-&gt;member[3])比访问结构成员作为数组更容易。 (c) 可以使用offsetof 和提供结构内成员映射的辅助数组来实现适当的(严格符合 C)解决方案。不要这样做;这是一种浪费。

标签: c gcc struct


【解决方案1】:

是的,有可能。

但是您需要在结构Coolstruct 中包含一个对象数组,而不是定义多个单个对象。

这是一个例子:

#include <stdio.h>

struct Coolstruct {
   int b[4];
};

void Update(int vaule, struct Coolstruct *Ice)
{
    for(int i=0;i<4;i++)
    {
        Ice->b[i] = vaule;
    }

    return;
}

int main(void) {

   struct Coolstruct x;

   int y = 25;

   Update(y, &x);   

   for(int i = 0; i < 4; i++)
   {
       printf("x.b[%d] = %d\n", i, x.b[i]);
   }

   return 0;
}

输出:

x.b[0] = 25
x.b[1] = 25
x.b[2] = 25
x.b[3] = 25

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多