将指针传递给结构作为参数

时间:2018-10-25 02:29:59

标签: c

我已经建立了一个结构,并且有一个指向该结构的指针,基本上是一个数组。我想创建一个函数来修改结构中的特定值,但似乎无法弄清楚如何将结构指针作为参数传递。

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的调用。

谢谢!

2 个答案:

答案 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;
    }
}