DaniWeb IT Discussion Community

DaniWeb IT Discussion Community (http://www.daniweb.com/forums/index.php)
-   C++ (http://www.daniweb.com/forums/forum8.html)
-   -   Reg Function pointers (http://www.daniweb.com/forums/thread82049.html)

sowmi Jun 27th, 2007 12:09 pm
Reg Function pointers
 
Hi All,

I am trying to implement the concept of function pointer in C++.
While compiling i got some errors which I couldnt figure out the reason .
So,Please let me know what changes should be done for resolving that error.

I am trying to execute one particular command function when the commandis pressed.Likewise, I have 100 commands and whenever the commands are pressed the corresponding function + arguements should be passed and the function pointer should execute the command.


Below are my code,


command.h
**********
#define FUNCPTR  void *
#define MAX_NUM_COMMANDS 3

typedef struct
{
  char command[LINELEN];                          /* name of the command */
  char parm1[LINELEN];                            /*parameter 1 */
  char parm2[LINELEN];                            /*parameter 2 */
                                     
} ExeCmd_s;
class FunctionEntry
{

public:
    char* commandString;
    FUNCPTR pFun; 
    int SearchCommand(char* command);
};
FunctionEntry funArr[MAX_NUM_COMMANDS]=
{
            {"aaa",(FUNCPTR)aaa},
            {"bbb", (FUNCPTR)bbb},
              {"ccc",(FUNCPTR)ccc}

};
enum commandName
{
        aaa = 0,
        bbb
};


command.c
**********
void void Execute ()
{
  .........
  .........
 Execmd execmd;
 FunctionEntry command;
 int rc;
 if(0 != SearchCommand(exeCmd.command))
 {
    command = FunctionEntry.SearchCommand(exeCmd.command);
    switch((int)command.numOfArguements)
    {
        case Zero :
          rc = ((command.pFun)();
          break;
        case one:
          rc = ((command.pFun),exeCmd.parm1);
          break;
    }
 }
 else
 {
  printf("No match");
 }

}



//Function to search and returns the index of the command

int FunctionEntry :: SearchCommand(char* command)
{
   
    ExeCmd_s exeCmd;  //already had a Structure where I am extracting the commandname..
    int index = 0;   
    while(index < MAX_NUM_COMMANDS)
    {
        if(strcmp(exeCmd.command,funArr[index]) == 0)
        {
            return &funArr[index];
        }
        index++;       
    }
    return NULL;
}




Please let me know where i should change the code.
Expecting some solutions for this code ASAP .

Thanks,
Sowmi

WaltP Jun 27th, 2007 2:49 pm
Re: Reg Function pointers
 
Quote:

Originally Posted by sowmi (Post 395444)
Hi All,

I am trying to implement the concept of function pointer in C++.
While compiling i got some errors which I couldnt figure out the reason .
So,Please let me know what changes should be done for resolving that error.

Which errors? Without posting them, we have no idea what the errors are.


Quote:

Originally Posted by sowmi (Post 395444)
I am trying to execute one particular command function when the commandis pressed.Likewise, I have 100 commands and whenever the commands are pressed the corresponding function + arguements should be passed and the function pointer should execute the command.

Without a clean compile, this info is moot.


Quote:

Originally Posted by sowmi (Post 395444)
Below are my code,

Below is my code. Code is singular in programming.

JRM Jun 27th, 2007 4:16 pm
Re: Reg Function pointers
 
I see no definition for public function
int SearchCommand()
in class FunctionEntry.

I suppose that might stop you dead in your tracks!

vijayan121 Jun 28th, 2007 2:09 am
Re: Reg Function pointers
 
Quote:

Originally Posted by sowmi (Post 395444)
...I have 100 commands and whenever the commands are pressed the corresponding function + arguements...

it is much more flexible to represent functions as objects . this would allow free functions, function objects and member functions to be treated polymorphically. also, since these are objects, they can support operations (eg.bind). in the following example, boost.function and boost.bind are used (from the boost libraries); however, both function and bind would be part of c++0x (they are in tr1).
#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <map>
using namespace std ;
using namespace boost ;

struct function_one // function object
{
  void operator() ( const string& arg ) const
  { cout << "function_one( " << arg << " )\n" ; }
};

void function_two( const string& arg ) // free function
{ cout << "function_two( " << arg << " )\n" ; }

struct object
{
  explicit object( int ii = 0 ) : i(0) {}
  int i ;
  void function_three( const string& arg ) // member function
  { cout << "object::function_three( " << arg << " )\n" ; ++i ; }
};

int main()
{
  typedef function< void ( const string& ) > function_t ;
  typedef pair< function_t, string > fn_with_arg_t ;
  map< string, fn_with_arg_t > function_map ;
  function_map[ "function object" ] = fn_with_arg_t( function_one(), "one" );
  function_map[ "free function" ] = fn_with_arg_t( function_two, "two" ) ;
  object obj ;
  function_map[ "member function" ] =
    fn_with_arg_t( bind( &object::function_three, ref(obj), _1 ), "three" );
  string key ;
  while( getline( cin, key ) )
  {
    typedef map< string, fn_with_arg_t >::iterator iterator ;
    iterator ptr = function_map.find(key) ;
    if( ptr != function_map.end() ) ptr->second.first( ptr->second.second ) ;
    else cout << "function not found\n" ;
  }
}


All times are GMT -4. The time now is 8:00 pm.

Forum system based on vBulletin Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
©2003 - 2009 DaniWeb® LLC