#ios #objective-c #c-preprocessor
#iOS #objective-c #c-препроцессор
Вопрос:
У меня есть некоторый открытый исходный код, который включает в себя это:
.h:
#define TILE_ROWS 6
#define TILE_COLUMNS 2
#define TILE_COUNT (TILE_ROWS * TILE_COLUMNS)
@class Tile;
@interface TilesViewController : UIViewController {
@private
CGRect tileFrame[TILE_COUNT];
Tile *tileForFrame[TILE_COUNT];
}
И затем по всему .m, вот так:
for (int row = 0; row < TILE_ROWS; row) {
for (int col = 0; col < TILE_COLUMNS; col) {
и
tileFrame[index] = frame;
и
tileForFrame[index] = tile;
Но что я хочу, так это иметь возможность задать TILE_ROWS для результата, например:
float rowsNeeded = ceil(rowsNeededA/TILE_COLUMNS);
Поэтому это нужно будет сделать позже, но я думаю, что CGRect и Tile могут быть определены только там. Мне нужна помощь, я не уверен, что делать.
Ответ №1:
Вы должны превратить defines в переменную экземпляра и динамически распределять массивы:
@class Tile;
@interface TilesViewController : UIViewController {
@private
int tileRows;
int tileColumns;
int tileCount;
CGRect* tileFrame;
Tile** tileForFrame;
}
...
tileColumns = 2;
tileRows = (rowsNeededA tileColumns - 1) / tileColumns;
tileCount = tileColumns * tileRows;
tileFrame = (CGRect*)malloc(tileCount * sizeof(CGRect));
tileForFrame = (Tile**)malloc(tileCount * sizeof(Tile*));
Затем цикл for становится:
for (int row = 0; row < tileCount; row) {
for (int col = 0; col < tileCount; col) {
Комментарии:
1. Спасибо за вашу помощь, действительно оценил и отсортировал большую часть моего кода. Еще одна небольшая проблема, с которой я сталкиваюсь, — это строки, подобные этой: ` if (tileForFrame [i].tileIndex == tileIndex) { return i; }` возвращает ошибку неправильного доступа. Как я могу изменить это, чтобы оно работало с моим новым кодом?
2. Чтобы помочь вам с вашей меньшей проблемой, я должен был бы увидеть объявление структуры Tile, класса или что бы это ни было. Возможно, вы можете получить к нему доступ как к структуре C, на которую ссылается, а именно «titleForFrame[i]->tileIndex».