Этот пример кода заставляет меня что-то определить, но я пока не хочу?

#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».