#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);
}
经过几个小时的研究,我可以解决一个问题来访问带索引的结构的任何子项,但我认为我没有采用正确的方法。
到目前为止,我理解我所做的事情,我通过指针选择父结构的第一个字节,将其强制转换为子结构,并在那里选择子索引。
有更简单,更好,更清洁的方法吗?
答案 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之外没有其他函数。