4

因此,基本上,我想将第一个struct的每个成员与第二个struct的每个成员相加,并且这些结构的类型相同。像这样:

struct Foo
{
    int bar1;
    int bar2;
    int bar3;
    int bar4;
    int bar5;
}

Foo AddFoos(Foo foo1, Foo foo2)
{
    Foo foo3;
    foo3.bar1 = foo1.bar1 + foo2.bar1;
    foo3.bar2 = foo1.bar2 + foo2.bar2;
    foo3.bar3 = foo1.bar3 + foo2.bar3;
    foo3.bar4 = foo1.bar4 + foo2.bar4;
    foo3.bar5 = foo1.bar5 + foo2.bar5;
    return foo3;
}

然而,当结构不断变大时,这种方式就很奇怪了。有什么办法可以用更少的代码来做到这一点?最好没有高级指针魔法?

4

4 回答 4

4

改为使用数组和 for 循环来添加数字:

struct Foo
{
    int bars[100];
};

for (i=0;i<100;i++)
{
foo3.bars[i]=foo1.bars[i]+foo2.bars[i];
}

如果在编译时数组大小未知,则可以malloc将结构更改为此,然后对所有三个Foo变量进行 malloc。

struct Foo
    {
        int *bars;
    };
于 2012-11-22T18:32:25.983 回答
3

根据您所说的“高级指针魔术”,您可以使用以下中等魔术代码:

Foo AddFoos(Foo foo1, Foo foo2)
{
    Foo foo3;
    int *pointer1 = &foo1.bar1; // first field here
    int *pointer2 = &foo2.bar1; // first field here
    int *pointer3 = &foo3.bar1; // first field here
    while (pointer3 <= &foo3.bar5) // last field here
    {
        *pointer3++ = *pointer1++ + *pointer2++;
    }
    return foo3;
}

当您更改 的定义时Foo,只需更新第一个和最后一个字段的名称。这仅在所有字段都属于同一类型时才有效。

于 2012-11-22T18:46:18.907 回答
3

您需要命名字段 ( bar1.. barN) 的舒适性以及可以循环以自动执行操作的数组之类的东西。首先我们定义结构(内存中字段的密集表示):

struct VectorFields {
    int a;
    int b;
    int c;
};

然后我们需要了解该结构中使用的字段数:

#define VECTOR_FIELDS_LEN (sizeof(struct VectorFields) / sizeof(int))

(在 C++ 中你可以使用一些模板魔法 foo,这里我们只是使用预处理器作为一个更简单的变体)。接下来,我们将struct VectorFields与一个大小都匹配的数组结合起来int,也称为union

union Vector {
    struct VectorFields fields;
    int raw[VECTOR_FIELD_LEN];
};

(注意:VECTOR_FIELD_LEN必须是编译器已知的常量值,因此之前的预处理器。)您现在可以通过数据的名称 ( .fields.a) 或索引 ( .raw[0]) 访问数据。因此,让我们编写将它们相加的函数Vector

void vector_add(union Vector* result, union Vector* a, union Vector* b) {
    int i;
    for (i = 0; i < TUPLE_LEN; i++) {
        result->raw[i] = a->raw[i] + b->raw[i];
    }
}

你可以这样使用它:

#include <stdio.h>
int main() {
    union Vector a = { .fields = { 1, 2, 3 } };
    union Vector b = { .fields = { 4, 5, 6 } };
    union Vector sum;

    vector_add(&sum, &a, &b);

    printf("%d %d %d\n", sum.fields.a, sum.fields.b, sum.fields.c);
    return 0;
}
于 2012-11-22T19:09:29.153 回答
1

如果你只有ints 你可以使用一个数组

struct Foo {
    int bar[5];
};

Foo AddFoos(Foo f1, Foo f2)
{
    Foo f3;
    int i;
    for (i = 0; i < 5; ++i)
        f3.bar[i] = f1.bar[i] + f2.bar[i];

    return f3;
}
于 2012-11-22T18:34:51.233 回答