通过索引访问struct元素

时间:2017-10-21 03:54:38

标签: c

#define GET_STRUCT_ITEM(child, parent, index) ((child*) &(&parent)[0])[index]

typedef struct {
    uint8_t val;
} key_child;

typedef struct {
    key_child key_0;
    key_child key_1;
    key_child key_2;
    key_child key_3;
} key_parent;

key_parent keys = {
    .key_0.val = 11,
    .key_1.val = 22,
    .key_2.val = 33,
    .key_3.val = 44
};

key_child key_a, key_b, key_c, key_d;

int main(void) {
    key_a = GET_STRUCT_ITEM(key_child, keys, 0);
    key_b = GET_STRUCT_ITEM(key_child, keys, 1);
    key_c = GET_STRUCT_ITEM(key_child, keys, 2);
    key_d = GET_STRUCT_ITEM(key_child, keys, 3);
}

经过几个小时的研究,我可以解决一个问题来访问带索引的结构的任何子项,但我认为我没有采用正确的方法。

到目前为止,我理解我所做的事情,我通过指针选择父结构的第一个字节,将其强制转换为子结构,并在那里选择子索引。

有更简单,更好,更清洁的方法吗?

1 个答案:

答案 0 :(得分:0)

正如其他人所说,当你从一个数组改为命名的项目时,我认为你做了逆行。除了所有其他方面,与使用数组相比,它使得元素之间的物体移动。

如果您认为必须执行指定版本,请在结构中使用C11中的匿名联合(和匿名结构):

lst <- split(df1, findInterval(df1$MPG, c(14, 17), rightmost.closed = TRUE))

使用命令(源文件#include <stdint.h> typedef struct { uint8_t val; } key_child; typedef struct { union { struct { key_child key_0; key_child key_1; key_child key_2; key_child key_3; }; key_child key[4]; }; } key_parent; key_parent keys = { .key_0.val = 11, .key_1.val = 22, .key_2.val = 33, .key_3.val = 44 }; key_parent quays = { .key = { [0] = { .val = 11 }, [1] = { .val = 22 }, [2] = { .val = 33 }, [3] = { .val = 44 }, } }; // Global to avoid 'unused variable' warnings key_child key_a, key_b, key_c, key_d; key_child quay_e, quay_f, quay_g, quay_h; int main(void) { key_a = keys.key[0]; key_b = keys.key[1]; key_c = keys.key[2]; key_d = keys.key[3]; quay_e = quays.key_0; quay_f = quays.key_1; quay_g = quays.key_2; quay_h = quays.key_3; } )与GCC 7.2.0(在运行macOS High Sierra 10.13的Mac上进行编译)完全编译:

au97.c

请注意,您可以通过任何一种方式访问​​该结构。如果您没有可用的匿名联合和结构(C99或更早版本),那么您必须为联合命名($ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -pedantic -c au97.c $ 是此的传统名称)和结构,并使用:

u

这已保存在#include <stdint.h> typedef struct { uint8_t val; } key_child; typedef struct { union { struct { key_child key_0; key_child key_1; key_child key_2; key_child key_3; } s; key_child key[4]; } u; } key_parent; key_parent keys = { .u.key = { { 11 }, { 22 }, { 33 }, { 44 } } }; key_parent quays = { .u.s = { { 11 }, { 22 }, { 33 }, { 44 }, } }; // Global to avoid 'unused variable' warnings key_child key_a, key_b, key_c, key_d; key_child quay_e, quay_f, quay_g, quay_h; int main(void) { key_a = keys.u.key[0]; key_b = keys.u.key[1]; key_c = keys.u.key[2]; key_d = keys.u.key[3]; quay_e = quays.u.s.key_0; quay_f = quays.u.s.key_1; quay_g = quays.u.s.key_2; quay_h = quays.u.s.key_3; } 中并使用以下内容进行编译:

au83.c

通过两次编译,我省略了我通常使用的$ gcc -O3 -g -std=c99 -Wall -Wextra -Werror -pedantic -c au83.c $ 标志,因为示例代码中除了main之外没有其他函数。