我已经建立了一个结构,并且有一个指向该结构的指针,基本上是一个数组。我想创建一个函数来修改结构中的特定值,但似乎无法弄清楚如何将结构指针作为参数传递。
struct deviations {
int switch;
int x;
int y;
};
struct deviations *pdevs = malloc(24 * sizeof(int));
for(int i = 0; i < 8; i++) {
(pdevs + i)->switchez = 1;
(pdevs + i)->x = 0;
(pdevs + i)->y = 0;
}
int top[3] = {0, 1, 2};
int bottom[3] = {5, 6, 7};
int left[3] = {0, 3 ,5};
int right[3] = {2, 4, 7};
for(int i = 0; i < 3; i++) {
(pdevs + top[i])->y = -1;
}
我有多个(8)for loops
,如上所述,除了数组(“ top”),左值('y')和右值('-1')外,它们的基本结构相同)各更改。我无法弄清楚如何使用结构/指针来声明一个函数以正确地进行结构化。
我目前大约有26行(重复8个循环)代码,如果可以弄清楚如何将指针传递给结构,我可以肯定我可以将其压缩为一个整洁的小函数。任何帮助将不胜感激!
此代码段是较大功能/程序的一部分,该功能/程序确定是否检查周围的项目(顶部3个,底部3个,每侧一个)。我已经根据基本项目的位置和x / y偏移量设置了带有开/关开关的结构。我试图在x或y位置将每个单元格移动一定数量的+ 1 / -1 /或0。我试图根据有关原始单元格x或y的某些条件打开或关闭该开关。 Malloc可能不是必需的,但是不确定此结构数组是否稍后会再次使用,如果没有,我将删除对malloc的调用。
谢谢!
答案 0 :(得分:1)
因此,您需要一个通用函数,该函数可以包含3个索引的数组,要填充的结构成员和值。
数组和值很简单。要一般性地处理结构成员,可以使用offsetof()
宏。
void fill_structs(struct deviations *pdevs, size_t offset, int indexes[3], int value) {
for (int i = 0; i < 3; i++) {
*((int *)((char *)&pdevs[indexes[i]] + offset)) = value;
}
}
然后您将其命名为:
fill_structs(pdevs, offsetof(struct deviations, y), top, -1);
offsetof()
返回结构成员相对于结构基数的偏移量(以字节为单位)。因此,在函数中,您必须将数组元素的地址转换为char *
,以便可以向其添加偏移量,然后将其转换为int *
,以便可以取消引用并将其分配给{{1 }}成员。
顺便说一句,您应该摆脱使用类似东西的习惯
int
如果您使用指针作为数组的基础,请使用数组语法:
(pdevs + i) -> x
以这种方式告诉pdevs[i].x
是一个数组索引要容易得多。
答案 1 :(得分:1)
这个答案纯粹是在挑战您对当前方法的思考。
就个人而言,除非涉及特殊逻辑,否则我将完全放弃循环并像这样初始化您的结构。
const struct deviations devs[8] = {
{ 1, -1, -1 }, // top-left
{ 1, 0, -1 }, // top
{ 1, 1, -1 }, // top-right
{ 1, -1, 0 }, // left
{ 1, 1, 0 }, // right
{ 1, -1, 1 }, // bottom-left
{ 1, 0, 1 }, // bottom
{ 1, 1, 1 } // bottom-right
};
如果您随后决定确实需要动态分配,则可以复制它:
struct deviations *pdevs = malloc(sizeof(devs));
if (pdevs) memcpy(pdevs, devs, sizeof(devs));
但是,如果您真的想循环生成这些东西,为什么不这样做呢?
int ii = 0;
for(int y = -1; y <= 1; ++y) {
for(int x = -1; x <= 1; ++x) {
if (x == 0 && y == 0) continue;
pdevs[ii].switch = 1;
pdevs[ii].x = x;
pdevs[ii].y = y;
++ii;
}
}