Objective-C Реализация класса (Инициализация массива) - PullRequest
0 голосов
/ 26 января 2012

Моя инициализация массива вызывает странную ошибку. Что-то я пропускаю? Ошибка в массиве gameBoard.

@implementation TicTacToe

- (id)init
{
    self = [super init];
    if (self)
    {
        gameBoard [3][3] = {{0, 0, 0},
                            {0, 0, 0},
                            {0, 0, 0}}; // error is saying: "expected expression"
        turn = 1;
        winner = 0;
        cellsChosen = 0;   
    }
    ...

Ответы [ 2 ]

1 голос
/ 26 января 2012

Ваш gameBoard объявлен в @interface TicTacToe, верно? Тогда вы не можете использовать синтаксис инициализации массива C, потому что ваш массив уже инициализирован. К сожалению, C не предоставляет ярлыка для назначения массивов, поэтому вы должны создать временный массив, инициализированный вашими значениями, а затем использовать memcpy для копирования его элементов в ваш массив.

...
if (self)
{
    int tmpGameBoard[3][3] = {{0, 0, 0},
                              {0, 0, 0},
                              {0, 0, 0}};
    NSAssert(sizeof(tmpGameBoard) == sizeof(gameBoard),
             @"gameBoard is not a 3x3 array");
    memcpy(gameBoard, tmpGameBoard, sizeof(tmpGameBoard));
...

NSAssert используется, чтобы убедиться, что вы не изменили размер массива в интерфейсе и забыли обновить его инициализацию (было бы лучше использовать утверждение времени компиляции вместо NSAssert, но это уже другая тема).

0 голосов
/ 26 января 2012

инициализатор objc не является 'правильным' инициализатором. Ваша память для ваших иваров уже существует, и она была инициализирована нулевой памятью. поэтому вы не используете фактический синтаксис инициализации в этой области. Вот почему const ivar бесполезен, если только вы не довольны использованием обнуленной памяти исключительно для этого ivar (или вы нарушаете const обещания).

Вы можете использовать присвоение для типа (создание временного), или вы можете использовать обычное копирование памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...