#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. Я думал, что компилятор достаточно умен, чтобы сделать это самостоятельно.