Hi,

Sorry that snippet was from an existing method that used a nil terminated list, 
you're right, I can't do that in this case.

I was thinking that it would be easier if everything was an Object, the types I 
need to support are:

id                                      
Numeric types, signed/unsigned integers of different lengths and floats.

So I could convert anything that is not an object into an NSNumber and 
numberWithXXX, which looks like the best way to go!


Doing it the other way, I know the number of parameters from "theName".

Rewriting the original code:

-(void) methodX:(NSString*) theName,…
{
va_list                                                         myArgumentList;
NSInteger                                                       myArgumentCount;
NSInteger                                                       myIndex;
NSArray *                                                       myTypeArray;
NSString*                                                       myType;
NSInteger                                                       myNSInteger;
CGFloat                                                         myCGFloat;
NSMutableString*                                        myFormattedString;

//  returns an array of types, index 0 = parameter 0 in the va_list as so:
//  NSString*, CGFloat,NSInteger,

myFormattedString = [[NSMutableString alloc] initWithString:@""];
myTypeArray = [self getTypeArrayForKey:theName];

myArgumentCount = [myTypeArray count];
va_start(myArgumentList,theMethodName);

for (myIndex = 0; myIndex < myArgumentCount; myArgumentCount++)
        {
        myType = [myTypeArray objectAtIndex: myIndex];
        if ([myType isEqualToString:@"NSInteger"] ) 
                {
                myNSInteger = va_arg(myArgumentList,NSInteger*);
//  do something with myNSInteger
                [myFormattedString appendFormat:@"myNSInteger = %d ", 
myNSInteger];
                }

        else if ([myType isEqualToString:@"CGFloat"] )
                {
                myCGFloat = va_arg(myArgumentList, CGFloat*);
//  do something with myCGFloat
                [myFormattedString appendFormat:@"myCGFloat = %f ", myCGFloat];
                }
        else if ([myType isEqualToString:@"XXXXX"] )
                …..
                …..
                …..
        }

va_end(myArgumentList);
}

Thanks a lot for your help.

Cheers
Dave


On 21 Aug 2013, at 09:02, "Stephen J. Butler" <stephen.but...@gmail.com> wrote:

> On Wed, Aug 21, 2013 at 2:35 AM, Dave <d...@looktowindward.com> wrote:
> -(void) methodX:(NSString*) theName,…
> {
> va_list                                                         
> myArgumentList;
> NSInteger                                                       
> myArgumentCount;
> 
> myArgumentCount = 0;
> va_start(myArgumentList,theMethodName);
> 
> while(va_arg(myArgumentList,NSString*) != nil)          //********************
>         myArgumentCount++;
> 
> Whatever else you're trying to do, you cannot write a loop like that. 
> va_arg() will NOT return nil/NULL/0 when it reaches the end. In fact, 
> va_arg() has no possible way of knowing when it has reached the end. That's 
> why you pass in theName; it's 100% up to you to parse theName and figure out 
> how many arguments were passed in and call va_arg() properly.
> 
> Or, alternately, force all of your arguments to be of a common base type 
> (say, "id") and nil terminate the list. A la +[NSArray arrayWithObjects:], 
> etc.
> 
> But you can't have it both ways.
> 
> Once you have that your while() loop is easy:
> 
> while (more_arguments) {
>   argument_type = get_next_arg_type();
>   if (argument_type == myNSStringType) {
>     objVal = va_arg(myArgList,NSString*);
>   } else if (argument_type == myNSIntegerType) {
>     intVal = va_arg(myArgList,NSInteger);
>   } ... etc ..
> 
>   more_arguments = has_more_arguments();
> }
> 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to