Доступ к полям структуры динамически

#c #struct

#c #структура

Вопрос:

Я определил эти 2 структуры:

 #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. Вероятно, вы можете упростить структуру данных. Может быть, вы могли бы определить структуру корабля, которая содержит позиции корабля, а не помещать так много в структуру battle_cell .

2. @Stuart определенно, структуры можно упростить, и это то, на что ответил парень ниже. Я попытался смоделировать сложный случай, просто чтобы привести пример. Я думаю, что мне нужно отредактировать вопрос, чтобы прояснить это 🙂

3. Я, вероятно, не понимаю вашего вопроса, потому что я не понимаю, как вам поможет создание массива [2] кораблей внутри battle_cell. Я думаю, что вместо указателя параметра поля вам просто нужен параметр, который указывает, к какому кораблю вы хотите получить доступ, а затем получить доступ к коду либо или, возможно, к обоим кораблям.

4. Я не знаю, что вы подразумеваете под «динамическим доступом к свойствам структуры».

5. @Stuart Определяя массив [2], вы можете сделать предположение, что позиция 0 будет ship_a, а позиция 1 будет ship_b. Затем вы можете передать простые целые числа 0 и 1 и сможете получить доступ к полям (по крайней мере, это то, что я понял). Однако я не уверен на 100%, понял ли я ваше предложение. Возможно ли создать очень маленький фрагмент и опубликовать его в качестве ответа?

Ответ №1:

Вместо if ship_a и ship_b int первой структуры вы можете объявить int ship[2] массив из 2 int .

Комментарии:

1. Это решение, которое может работать, но мне бы очень хотелось знать, есть ли способ динамического доступа к свойствам структуры.

2. Я думал, что компилятор достаточно умен, чтобы сделать это самостоятельно.