Не знаю, почему петля не работает? - PullRequest
0 голосов
/ 01 марта 2011

В отладчике происходит сбой, и я получаю эту ошибку, но объект с номером индекса постоянно меняется каждый раз.* Завершение приложения из-за необработанного исключения «NSRangeException», причина: «* - [NSMutableArray insertObject: atIndex:]: индекс 15 за пределами для пустого массива»

    #define NUMPOINTS 16
    #define NUMSPRITES 16   

    int myXPoints [NUMPOINTS];
    int myYPoints [NUMPOINTS];
    CCSprite *mySpritePointers [NUMSPRITES];

    NSMutableArray *mySpriteArray = [[NSMutableArray alloc] initWithCapacity:16];
    [mySpriteArray insertObject:sprite1 atIndex:0];
    [mySpriteArray insertObject:sprite2 atIndex:1];
    [mySpriteArray insertObject:sprite3 atIndex:2];
    [mySpriteArray insertObject:sprite4 atIndex:3];
    [mySpriteArray insertObject:sprite5 atIndex:4];
    [mySpriteArray insertObject:sprite6 atIndex:5];
    [mySpriteArray insertObject:sprite7 atIndex:6];
    [mySpriteArray insertObject:sprite8 atIndex:7];
    [mySpriteArray insertObject:sprite9 atIndex:8];
    [mySpriteArray insertObject:sprite10 atIndex:9];
    [mySpriteArray insertObject:sprite11 atIndex:10];
    [mySpriteArray insertObject:sprite12 atIndex:11];
    [mySpriteArray insertObject:sprite13 atIndex:12];
    [mySpriteArray insertObject:sprite14 atIndex:13];
    [mySpriteArray insertObject:sprite15 atIndex:14];
    [mySpriteArray insertObject:sprite16 atIndex:15];

    mySpritePointers [0] = (CCSprite *)[mySpriteArray objectAtIndex:0];
    mySpritePointers [1] = (CCSprite *)[mySpriteArray objectAtIndex:1];
    mySpritePointers [2] = (CCSprite *)[mySpriteArray objectAtIndex:2];
    mySpritePointers [3] = (CCSprite *)[mySpriteArray objectAtIndex:3];
    mySpritePointers [4] = (CCSprite *)[mySpriteArray objectAtIndex:4];
    mySpritePointers [5] = (CCSprite *)[mySpriteArray objectAtIndex:5];
    mySpritePointers [6] = (CCSprite *)[mySpriteArray objectAtIndex:6];
    mySpritePointers [7] = (CCSprite *)[mySpriteArray objectAtIndex:7];
    mySpritePointers [8] = (CCSprite *)[mySpriteArray objectAtIndex:8];
    mySpritePointers [9] = (CCSprite *)[mySpriteArray objectAtIndex:9];
    mySpritePointers [10] = (CCSprite *)[mySpriteArray objectAtIndex:10];
    mySpritePointers [11] = (CCSprite *)[mySpriteArray objectAtIndex:11];
    mySpritePointers [12] = (CCSprite *)[mySpriteArray objectAtIndex:12];
    mySpritePointers [13] = (CCSprite *)[mySpriteArray objectAtIndex:13];
    mySpritePointers [14] = (CCSprite *)[mySpriteArray objectAtIndex:14];
    mySpritePointers [15] = (CCSprite *)[mySpriteArray objectAtIndex:15];

    myXPoints [0] = 61;
    myXPoints [1] = 61;
    myXPoints [2] = 61;
    myXPoints [3] = 61;
    myXPoints [4] = 180;
    myXPoints [5] = 180;
    myXPoints [6] = 180;
    myXPoints [7] = 180;
    myXPoints [8] = 300;
    myXPoints [9] = 300;
    myXPoints [10] = 300;
    myXPoints [11] = 300;
    myXPoints [12] = 420;
    myXPoints [13] = 420;
    myXPoints [14] = 420;
    myXPoints [15] = 420;

    myYPoints [0] = 37;
    myYPoints [1] = 110;
    myYPoints [2] = 182;
    myYPoints [3] = 253;
    myYPoints [4] = 37;
    myYPoints [5] = 110;
    myYPoints [6] = 182;
    myYPoints [7] = 253;
    myYPoints [8] = 37;
    myYPoints [9] = 110;
    myYPoints [10] = 182;
    myYPoints [11] = 253;
    myYPoints [12] = 37;
    myYPoints [13] = 110;
    myYPoints [14] = 182;
    myYPoints [15] = 253;

    for (int nSprite = 0;  nSprite < NUMSPRITES;  nSprite++){
        for (int nPoint = 0;  nPoint < NUMPOINTS;  nPoint++){
            c1array = [[NSMutableArray alloc] initWithCapacity:16];
            if(mySpritePointers [nSprite].position.x == myXPoints [nPoint] && mySpritePointers [nSprite].position.y == myYPoints [nPoint]){
                [c1array insertObject:mySpritePointers [nSprite] atIndex:nPoint];
            } 
        }
    }

Ответы [ 4 ]

2 голосов
/ 01 марта 2011

Ответ таков: -initWithCapacity: не делает то, что вы думаете, делает.Вы не получите массив с 16 пустыми слотами, в которые вы вставляете объекты в любой точке.Вы по-прежнему получаете пустой ([array count] == 0) массив, и попытка вставить объект в любую позицию, кроме позиции 0, не удастся.Параметр Capacity просто дает подсказке времени выполнения о том, насколько велик может расти массив.

Чтобы в вашем массиве было 16 слотов, чтобы вы могли вставлять / заменять его при любом индексе <16, вам нужнодобавьте в него несколько объектов, например NSNull. </p>

 NSMutableArray* myArray = [[NSMutableArray alloc] initWithCapacity: 16];
 for (int i = 0 ; i < 16 ; ++i)
 {
     [myArray addObject: [NSNull null]];
 }

 // Now the array has a count of 16.

Я не совсем уверен, что вы пытаетесь сделать, но я подозреваю, что в вашем цикле for вы должны использовать -replaceObjectAtIndex:withObject: вместо -insertObjectAtIndex:

1 голос
/ 01 марта 2011

Вы перераспределяете c1array каждый раз через цикл. Вы, вероятно, не хотите этого делать.

0 голосов
/ 01 марта 2011
for (int nSprite = 0;  nSprite < NUMSPRITES;  nSprite++){
    for (int nPoint = 0;  nPoint < NUMPOINTS;  nPoint++){
        c1array = [[NSMutableArray alloc] initWithCapacity:16];
        if(mySpritePointers [nSprite].position.x == myXPoints [nPoint] && mySpritePointers [nSprite].position.y == myYPoints [nPoint]){
            [c1array insertObject:mySpritePointers [nSprite] atIndex:nPoint];
        } 
    }
}

Как упомянуто выше, вы перераспределяете NSMutableArray каждый раз при запуске цикла.попробуйте это:

c1array = [[NSMutableArray alloc] initWithCapacity:16];
for (int nSprite = 0;  nSprite < NUMSPRITES;  nSprite++){
    for (int nPoint = 0;  nPoint < NUMPOINTS;  nPoint++){
        if(mySpritePointers [nSprite].position.x == myXPoints [nPoint] && mySpritePointers [nSprite].position.y == myYPoints [nPoint]){
            [c1array insertObject:mySpritePointers [nSprite] atIndex:nPoint];
        } 
    }
}

Также я не вижу причин создавать то, что вы создаете: S

Вы можете использовать циклы вместо того, чтобы перепечатывать большую часть кода;1007 *

0 голосов
/ 01 марта 2011

Разве вы не должны распределять c1array между двумя циклами for (nSprite и nPoint)?

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