Login | Register   
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: C++
Expertise: Beginner
Sep 3, 1999

Passing More Arguments to a Callback Function

Callback functions have a fixed signature so you cannot alter the number or type of the arguments it takes. For example, the standard qsort() function takes a pointer to a function that has the following signature:
 

  int (cmp*)(const void *, const void *) //user's comparison function

This signature allows you to pass exactly two arguments to your custom-made comparison function. However, suppose that the comparison function has to compare strings and you want to pass a third argument to indicate whether the comparison should be case-sensitive or not. You cannot simply add a third argument to the function call, because the compiler will complain about it (don't even think about casting the function pointer; see this tip). Instead, you can define a struct that contains two members:

 

  struct Comparison
  {
    char *name;
    bool caseSensitive;
  };

Now instead of passing a pointer to char as the second argument, you can pass a pointer to an instance of that struct. The comparison function will unpack the struct and compare the strings accordingly:

 
  int MyCompareFunc(const void *pfirst, const void * psecond)
  {
    const Comparison * pcmp = (Comparison *) psecond; 
    const char * pstr1 = (const char *) pfirst; 
    const char * pstr2 = pcmp->name; //extract string from struct
    if (pcmp->caseSensitive == true) //the second field of the struct
    { 
       return strcmp(pstr1, pstr2)
    }
    else    
    { 
      //perform case-insensitive comparison
    }
}
Danny Kalev
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap