动态访问结构的字段

时间:2016-10-06 18:22:38

标签: c struct

我已经定义了这两个结构:

#define MAP_SIZE 5

typedef struct battle_cell {
  int status_a;
  int status_b;

  int ship_a;
  int ship_b;
} battle_cell;

struct battlemap {
  battle_cell cell[MAP_SIZE][MAP_SIZE];
  int progress_a;
  int progress_b;
};

用地图初始化地图和所有其他变量后用零:

for (i = 0; i < MAP_SIZE; i++) {
  for (j = 0; j < MAP_SIZE; j++) {
    map->cell[i][j].status_a = 0;
    map->cell[i][j].status_b = 0;
    map->cell[i][j].ship_a = 0;
    map->cell[i][j].ship_b = 0;
  }
}

map->progress_a = 0;
map->progress_b = 0;

有一点我必须检查每个单元格中的ship_a和ship_b值,就像那样(逻辑比这次迭代复杂一点):

for (i = posXB; i < posXB + SHIP_SIZE; i++) {
  map->cell[posYB][i].ship_b = 1;
}

我需要为ship_a变量做同样的事情。因此,我必须复制相当大的代码块,因为我无法找到一种方法来动态获取结构中的字段。例如,我可以定义一个函数:

void cell_iteration (battlemap *map, int pos, int pos_y, int ship_size, /* field_parameter/pointer */) {
  int i;
  for (i = pos; i < pos + ship_size; i++) {
    map->cell[pos_y][i].ship_b = 1; // use the field_parameter/pointer instead of ship_b
  }
}

有没有一种优雅的方式来做这样的事情?

更新

只是澄清一下。结构肯定可以简化,但这不是我的问题。我刚试图创建一个例子:)

1 个答案:

答案 0 :(得分:3)

如果第一个结构中有ship_aship_b,则可以将int ship[2]数组声明为int