Hacer sengul Akac
Hacer sengul Akac

Reputation: 683

NSMutableArray empty array error

I am doing some operations in for loop with nsmutablearray' s data. But sometimes it work sometimes it gives me an error like 'array index 3 empty array' at this line :

else if (min>[[enyakinarray objectAtIndex:i] floatValue]) 

full code :

for (int i=0; i<[ws3.CustomerID count]; i++) {

    //radian hesaplaması
    float total = [first floatValue];
    float theta = total * M_PI/180;
    float total2 = [second floatValue];
    float theta2 = total2 * M_PI/180;
    float total3 = [[ws3.Latitude objectAtIndex: i]  floatValue];
    float theta3 = total3 * M_PI/180;
    float total4 = [[ws3.Longitude objectAtIndex: i] floatValue];
    float theta4 = total4 * M_PI/180;


     distance = 6371 * acos(cos(theta) * cos(theta3)
                           * cos(theta4 - theta2)
                           + sin(theta) * sin( theta3)) ;

    NSLog(@"xxxxx %f",distance);

    num = [NSNumber numberWithFloat:distance];
    [enyakinarray  addObject:num];
    NSLog(@"asasasas %@",enyakinarray);

}

float min;
NSString *s;
for (int i=0; i<[enyakinarray count]; i++) {
   if(i==0)
   { 
    min = [[enyakinarray objectAtIndex:i] floatValue];
    s= [ws3.CustomerName objectAtIndex:i];
   } 
   else if (min>[[enyakinarray objectAtIndex:i] floatValue])
            {
            min= [[enyakinarray objectAtIndex:i] floatValue];
            s = [ws3.CustomerName objectAtIndex:i];
            }
    enyakinfirma.text=s;
   }

How can I solve this?

Upvotes: 1

Views: 270

Answers (1)

Sulthan
Sulthan

Reputation: 130082

This is strange but should be really easy to debug. Just write

NSLog("First array: %@", enyakinarray)
NSLog(@"Second array: %@", ws3.CustomerName)
NSLog(@"Second array: %@", ws3.CustomerID)

before your for and you should see the problem very quickly. Maybe you are changing the array contents somewhere between its creation and usage?

However, I see a design problem there. Your code uses several separate arrays CustomerName, CustomerID and enyakinarray Latitude and Longitude which contain values of a single entity Customer (name, id, latitude, longitude and distance). Maybe you could create an object Customer with these properties and mantain only one array of customers? Good OOP design helps you prevent this type of errors :)

And you can merge the two cycles into one:


float minDistance = FLT_MAX;
NSUInteger customerIndex = 0;

for (NSUInteger i = 0; i < [ws3.CustomerID count]; i++) {
    /* distance calculation code ... */

    float distance = 6371 * acos(cos(theta) * cos(theta3)
                           * cos(theta4 - theta2)
                           + sin(theta) * sin(theta3));

    if (distance < minDistance) {
        minDistance = distance;
        customerIndex = i;
    }
}

enyakinfirma.text = [ws3.CustomerName objectAtIndex:customerIndex];

Upvotes: 1

Related Questions