Funktionszeiger...
-
Hi Leute, ich probier grad biss rum mit funktionszeiger!
Hab mir da mal ne "Testconsole" gebaut....verwendete bis jetzt nur voidzeiger ohne parameter!Wie kann ich aber auch funktionen mit rückgabewert und funktionen mit parametern einbauen?
Code:
#pragma argsused struct sFUNKTION { void (*funktion)(); void (*charfunktion)(const char*); char* console_String; char* Inputbuffer; }; bool bQuit=false; const int ADF=5; sFUNKTION FM[ADF]; void Stats() { cout<<"Time: "<<__TIME__<<endl; cout<<"Line: "<<__LINE__<<endl; cout<<"File: "<<__FILE__<<endl; } void OutPut() { cout<<"Outputfunktion"<<endl; } void InPut(int i,const char* Input) { cout<<Input; } void Quit() { cout<<"Console wird beendet..."<<endl; bQuit=true; } void Help() { cout<<"Help\t - Shows Help"<<endl; cout<<"Output\t - Shows a Teststring"<<endl; cout<<"Quit\t - Exits Console"<<endl; cout<<"Stats\t - Shows Time and File statistics"<<endl; } void InitManager() { FM[0].console_String="Stats"; FM[0].funktion=Stats; FM[1].console_String="Output"; FM[1].funktion=OutPut; FM[2].console_String="Quit"; FM[2].funktion=Quit; FM[3].console_String="Help"; FM[3].funktion=Help; FM[4].console_String="Input"; FM[4].funktion=Input; //GEHT NICHT } int main(int argc, char* argv[]) { InitManager(); char console_buffer[200]; while(bQuit==false) { cout<<"ser1al Console V0.2b 15.07.05"<<endl; cout<<">";cin>>console_buffer; for(int i=0;i<ADF;i++) { if(strcmp(console_buffer,FM[i].console_String)==0) { FM[i].funktion(); //wie müsste ich hier funktion mit para aufrufen? cout<<endl; cout<<"Weiter mit Taste..."<<endl;getch(); system("cls"); } } } getch(); return 0; }so, die 2 stellen hab ich mit kommentaren markiert!
wenn ihr sonst noch gobe fehler seht, sagt bitte bescheid!
-
So würde ich es machen.
int addiere(int a, int b) { return a +b; } typedef int(func)(int, int); typedef int(*fptr)(int, int); int main () { func* funktion = addiere; ftpr functio = addiere; int nWert = functio(2,4); return funktion(2,4); }
-
hm...aber wie müsste das oben bei mir ungefähr aussehen??
-
hm...hat keiner eine idee??
-
hehejo schrieb:
So würde ich es machen.
int addiere(int a, int b) { return a +b; } typedef int(func)(int, int); typedef int(*fptr)(int, int); int main () { func* funktion = addiere; ftpr functio = addiere; int nWert = functio(2,4); return funktion(2,4); }und wieso eigentlich typedef?
Kann mir jemand sagen,wie das bei meinem obigen beispiel ausschauen müsste?
-
würd mich echt freuen!
-
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.
Kurtnein 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