I’m workingon a way to average arbitrarily many numbers in Objective-C, and this is my method so far:
-(double)average:(double)num, ...
{
va_list args;
va_start(args, num);
double currentAverage = num;
long long timesAveraged = 1;
for(double d in args)
currentAverage = ((currentAverage * timesAveraged) + d) / ++timesAveraged;//Error occurs on this line
return currentAverage;
}
However, when I compile it, I get an error stating that “Selector element does not have a valid object type“, so my first solution was to change the method to the following:
-(double)average:(double)num, ...
{
va_list args;
va_start(args, num);
double currentAverage = num;
long long timesAveraged = 1;
for(NSNumber *d in args)
currentAverage = ((currentAverage * timesAveraged) + [d doubleValue]) / ++timesAveraged;//Error occurs on this line
return currentAverage;
}
However, now it gives me the unsettlingly similar error that “Expression does not have a valid object type“.
I’m obviously doing this wrong. Any suggestions on how to do this right?
Solution
I’ve been able to compile the file by writing the method as such:
-(double)average:(double)num, ...
{
va_list args;
va_start(args, num);
double currentAverage = num;
long long timesAveraged = 1;
for (NSNumber *arg = [NSNumber numberWithDouble:num]; arg != nil; arg = va_arg(args, NSNumber*))
{
currentAverage = ((currentAverage * timesAveraged) + [arg doubleValue]) / ++timesAveraged;
}
va_end(args);
return currentAverage;
}
As trudyscousin mentioned fast enumeration won’t work here. You should also use
va_argto extract data from the arguments list. Read more about it here: http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html