Funktionszeiger...



  • Du kannst in C++ keine Funktionszeiger verschiedenen Typs zuweisen, d.h.

    in deinem Beispiel mußt du dann folgendes schreiben:

    FM[4].charfunktion=InPut; // nicht Input!!!
    

    Da das Struktur-Array FM global initialisiert ist, sind alle Member auf 0 gesetzt (ansonsten müßtes du dort einen Konstruktor erzeugen, der dies tut - wäre generell sowieso besser), und du kannst dann abfragen, welcher Funktionszeiger gesetzt ist, also

    if(FM[i].funktion)
       FM[i].funktion();
    else if(FM[i].charfunktion)
       FM[i].charfunktion("hallo");  // welcher Parameter hierhin soll, mußt du entscheiden!!!
    

    Sehe gerade, daß außerdem die Funktion "InPut" und die Deklaration der "charfunktion" nicht übereinstimmen, d.h. du mußt entweder noch "int i" zur Deklaration hinzufügen oder aber aus der Funktion löschen!



  • bin mir jetzt überhaupt nicht sicher (hab sowas noch net gemacht), aber geht das net au irgendwie mit switch?



  • habs mal so probiert....da is noch ein problem:

    struct FUNKTION
    {
     char* co_string;
     void (*funktion)();
     char* (*charfunktion)(const char*);
     void (*charfunktion2)(char*);
    };
    
    FUNKTION FM[3];
    
    void test()
    {
     cout<<"test"<<endl;
    }
    
    char* test2(const char* ch)
    {
    char* test;
    strcpy(test,ch);
    return test;
    
    }
    
    void test3(char* ch)
    {
      cout<<"test3"<<endl;
    
    }
    void InitManager()
    {
     FM[0].co_string="test";
     FM[0].funktion=test;
     FM[1].co_string="test2";
     FM[1].charfunktion=test2;
     FM[2].co_string="test3";
     FM[2].charfunktion2;
    }
    
    int main(int argc, char* argv[])
    {
     InitManager();
     char eingabe_buffer[200];
     cin>>eingabe_buffer;
     for(int i=0;i<3;i++)
     {
      if(strcmp(eingabe_buffer,FM[i].co_string)==0)
      {
       if(FM[i].funktion)
        FM[i].funktion();
       else if(FM[i].charfunktion)
        cout<<FM[i].charfunktion(eingabe_buffer)<<endl;
       else if(FM[i].charfunktion2)
        FM[i].charfunktion2(eingabe_buffer);
       else
        cout<<"Fehler"<<endl;
      }
     }
     getch();       return 0;
    }
    

    wenn ich jetzt test3 eingebe, kommt fehler...aber da müsste doch charfunktion2 aufgerufen werden?!

    sieht jemand fehler?? 😕



  • int main(int argc, char* argv[]) { 
     InitManager(); 
     char eingabe_buffer[200]; 
     cin>>eingabe_buffer; 
     if(strcmp(eingabe_buffer,FM[0].co_string)==0) 
        FM[0].funktion(); 
     else if(strcmp(eingabe_buffer,FM[1].co_string)==0)
        cout<<FM[1].charfunktion(eingabe_buffer)<<endl; 
     else if(strcmp(eingabe_buffer,FM[2].co_string)==0)
        FM[2].charfunktion2(eingabe_buffer); 
     else 
        cout<<"Fehler"<<endl; 
     getch();       
      return 0; 
    }
    


  • hm....was ist da jetzt anders als bei mir?
    Er prüft doch jetzt den string?

    Was ist denn bei mir oben falsch?

    Denn test und test2 geht?!

    Anders gefragt, wie setze ich dein beispiel mit meiner schleife um???

    sorry, aber funktionszeiger sind nicht so mein gebiet!!! 😕



  • int main(int argc, char* argv[])
    {
     InitManager();
     char eingabe_buffer[200];
     cin>>eingabe_buffer;
    
       if(strcmp(eingabe_buffer,FM[0].co_string)==0)
        FM[0].funktion();
       else if(strcmp(eingabe_buffer,FM[1].co_string)==0)
        cout<<FM[1].charfunktion(eingabe_buffer)<<endl;
       else if(strcmp(eingabe_buffer,FM[2].co_string)==0)
        FM[2].charfunktion2(eingabe_buffer);
       else
        cout<<"Fehler"<<endl;
    
     getch();       return 0;
    }
    

    jetzt wird aber test3 auch nich aufgerufen, aber fehler zeigt er auch nicht...!



  • Tut mir leid dass ich mich eingemischt habe. Eigentlich verstehe ich überhaupt nich was du da machst.
    Kurt



  • ZuK schrieb:

    Tut mir leid dass ich mich eingemischt habe. Eigentlich verstehe ich überhaupt nich was du da machst.
    Kurt

    nein ist doch supi....geht ja auch fast alles durch deine hilfe...!

    Ich möchte eben das er die funktion im charfunktion2 zeiger aufruft...,eben wenn der text test3 ist(welcher ja bei co_string bei FM[2] steht)!



  • d hast in deine InitManager() bei FM[2] dem Funktionszeiger keine Funktion zugeordnet..:!



  • Nach längerem Überlegen bin ich zu dem Schluss gekommen du möchtest folgendes probieren:

    #include <iostream>
    using namespace std;
    
    struct function_selection
    { 
      char* co_string; 
      union {
        void (*funktion)(); 
        char* (*charfunktion)(const char*); 
        void (*charfunktion2)(char*); 
      };
    }; 
    
    function_selection FM[3]; 
    
    void test() 
    { 
       cout<<"test"<<endl; 
    } 
    
    char* test2(const char* ch) 
    { 
       return (char*)ch; // schlecht ist aber nur ein beispiel
    } 
    
    void test3(char* ch) 
    { 
      cout<<"test3(" << ch << ")" <<endl; 
    } 
    
    void InitManager() 
    { 
      FM[0].co_string="test"; 
      FM[0].funktion=test; 
      FM[1].co_string="test2"; 
      FM[1].charfunktion=test2; 
      FM[2].co_string="test3"; 
      FM[2].charfunktion2=test3; 
    } 
    
    int addiere(int a, int b) { 
      return a +b; 
    } 
    
    int main () { 
    	InitManager();
    	for ( int i= 0; i < 3; i++ ) {
    	  if(strcmp("test",FM[i].co_string)==0) 
    	     FM[i].funktion(); 
    	   else if(strcmp("test2",FM[i].co_string)==0) 
    	      cout<<FM[i].charfunktion("some string")<<endl; 
    	   else if(strcmp("test3",FM[i].co_string)==0) 
    		  FM[i].charfunktion2("some string"); 
    	   else 
    		  cout<<"Fehler"<<endl; 
    	}
    	system("pause");
    	return 0;
    }
    

    Kurt


Anmelden zum Antworten