Dangermouse
Dangermouse

Reputation: 95

Don't know why loop does not work?

In the debugger it crashes and i get this error but the object at index number keeps changing each time. * Terminating app due to uncaught exception 'NSRangeException', reason: '* -[NSMutableArray insertObject:atIndex:]: index 15 beyond bounds for empty array'

    #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];
            } 
        }
    }

Upvotes: 0

Views: 654

Answers (4)

JeremyP
JeremyP

Reputation: 86651

The answer is that -initWithCapacity: does not do what you think it does. You do not get an array with 16 empty slots that you insert objects into at any point. You still get an empty ([array count] == 0) array and attempting to insert an object at any position except position 0 will fail. The capacity parameter just gives the run time an advanced hint about how big the array is likely to grow.

To make your array actually have 16 slots so you can insert/replace at any index < 16, you need to add some objects to it e.g. NSNull.

 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.

I'm not quite sure what you are trying to do, but I suspect, in your for loop, you should be using -replaceObjectAtIndex:withObject: rather than -insertObjectAtIndex:

Upvotes: 2

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];
        } 
    }
}

As mentioned above you reallocate the NSMutableArray every time the loop runs. try this:

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];
        } 
    }
}

Aslo i can't see any reason to create what you are creating :S

You can use loops for instead of retyping for most of your code ;)

Upvotes: 0

user122299
user122299

Reputation:

Shouldn't you be allocating c1array between the two for loops (nSprite and nPoint)?

Upvotes: 0

Darron
Darron

Reputation: 21628

You're re-allocating c1array each time through your loop. You probably don't want to do that.

Upvotes: 1

Related Questions