Zum Inhalt springen

Funktionszeiger


pit030771

Empfohlene Beiträge

:confused:

Hi,

habe da ein Prob mit Funtionszeigern, vieleicht kann mir jemand helfen!

Arbeite grade das Buch "Die C++ Programmiersprache" durch.

Bin an dem Kapitel Zeiger auf Funktionen angelangt.

So die Übung lautet wie folgt ...

"Schreiben Sie Deklarationen für das folgendende:

eine Funktion, die Argument vom char* und int& hat und keinen Wert zurückgibt;

einen Zeiger auf solche Funktion;

eine Funktion die einen solchen Zeiger als Argument erhält;

eine Funktion die einen solchen Zeiger zurückgibt.

Schreiben Sie eine Definition einer Funktion, die einen solchen Zeiger als Argument und ihr Argument als Rückgabewert liefert.

TIPP: Benutzen Sie typedef."

Habe auch schon rumexperimentiert, aber komm nicht weiter ...

#include "..\std_include.h"

void f1(char*, int&);

void (*zf1) (char*, int&);

typedef void (*fzeiger)(char*, int&) ;

fzeiger fnk1(char*, int&);

fzeiger (*z)(char*, int&);

void* (zeig) (void* a);

typedef void ( *zeig2) (void*);

zeig2 zeige(zeig2);

void main()

{

int d=9;

z= &fnk1; //geht

zf1 =&f1; // geht auch

zf1("Hallo", d);

d++;

fnk1("hallo", d);

d++;

z("hallo2", d);

cout <<zeig(*zf1)<<" *zf1"<<endl; // funzt auch

cout <<zeig(*z) <<" *z "<<endl<<endl; // funzt auch

cout <<zeige(*zeig); // aber da gibt probs mit der konvertierung

cin.get();

}

fzeiger fnk1(char* a, int& B)

{

cout <<a<<" "<<b<<endl;

return 0;

}

void* zeig(void* a)

{

cout <<a<<endl;

return a;

}

void f1(char* a, int& B)

{

cout <<a<<" f1 "<<b<<endl;

}

zeig2 zeige(zeig2 a)

{

cout<<a<<endl;

return a;

}

Wäre sehr nett wenn Ihr mir helfen könntet.

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke!!! :-(

Wofür?

Dafür, dass niemand Lust hatte, in deinem Code, der nicht eingerückt ist, weil du keine Code-Tags benutzt hast, den Fehler zu suchen?

Dafür, dass niemand versucht hat, ohne irgendeine Fehlerbeschreibung von dir sich den Code genauer anzusehen? Übrigens: "komm nicht weiter" und "probs mit der konvertierung" sind keine brauchbare Fehlerbeschreibung.

Dafür, dass niemand raten wollte, ob du eine Frage hast und wie sie lauten könnte? Gestellt hast du nämlich keine.

Dass du bisher keine Antworten bekommen hast, liegt hauptsächlich an dir.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann noch mal von vorn....


#include "..\std_include.h"



void f1(char*, int&);


void (*zf1) (char*, int&);


typedef void (*fzeiger)(char*, int&) ;


fzeiger fnk1(char*, int&);


fzeiger (*z)(char*, int&);


void* (zeig) (void* a);


typedef void ( *zeig2) (void*);


zeig2 zeige(zeig2);



void main()

{

	int d=9;


	z= &fnk1;


	zf1 =&f1;


	zf1("Hallo", d);

	d++;


	fnk1("hallo", d);


	d++;

	z("hallo2", d);


	cout <<zeig(*zf1)<<"  *zf1"<<endl;

	cout <<zeig(*z)  <<"  *z  "<<endl<<endl;


	cout <<zeige(*zeig); // diese Zeile macht probleme unten mehr




	cin.get();

}


fzeiger fnk1(char* a, int& 

{

	cout <<a<<"  "<<b<<endl;



	return 0;

}


void* zeig(void* a)

{


	cout <<a<<endl;


	return a;


}

void f1(char* a, int& 

{

	cout <<a<<"  f1  "<<b<<endl;

}

zeig2 zeige(zeig2 a)

{

	cout<<a<<endl;

	return a;

}

[/code]

** Da schmeist der Compiler die Fehlermeldung raus:

error C2664: 'zeige': Konvertierung des Parameters 1 von 'void *(void *)' in 'zeig2' nicht möglich

Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

was bedeutet das und warum ist das so?

Verstehe das nicht!

zeig2 ist doch auch als void* definiert, oder hab ich das mit typedef falsch

verstanden??

Ich hoffe das ist jetzt ausreichender! Sry.

Gruß

p

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann man so eine Funktion auch so def, dass ich jede Art von funktion als zeiger übergeben kann. Oder müssen die über und Rückgabetypen übereinstimmen?
Die müssen genau übereinstimmen. Es gibt bei Funktionszeigern keine automatischen Konvertierungen. Bei C++ kommt bei bei Memberfunktionszeigern noch der Typ der Klasse hinzu, außer bei statischen Memberfunktionen.

Etliche Compiler unterscheiden auch noch nach Aufrufkonvention.

Link zu diesem Kommentar
Auf anderen Seiten teilen

GetProcAddress zum Beispiel kann ja auch Funktionszeiger mit beliebigen Rückgabewerten und Parametern zurück geben.
Nein, GetProcAddress gibt dir immer einen Funktionszeiger vom Typ FARPROC zurück, das ist eine Funktion, die keine Parameter hat und int zurückgibt. Weil das in den wenigsten Fällen stimmt, und weil es eben bei Funktionszeigern keine impliziten Konvertierungen gibt, musst du den Rückgabewert ja meistens mit einem Cast explizit umwandeln.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Compiler tut das, wenn man C++-Funktionen aus DLLs exportiert. Die Name Decoration, mit der die Aufrufkonvention und die Rückgabe- und Parametertypen in den Namen integriert werden, dient allerdings nur dazu, auch bei DLL-Importen Überladung anbieten zu können. Ein generischer Mechanismus ist das eigentlich nicht. C++-Funktionen importiert man ja üblicherweise auch nicht mit GetProcAddress.

Wenn man so etwas selbst machen will, muss man die Typinformationen irgendwie anders transportieren, denn Namen hat man zur Laufzeit nicht, und dynamic_cast gibt's bei Funktionszeigern auch nicht. Das riecht nach schlechtem Design.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich danke euch für eure antworten.

wollte auch jetzt nicht so eine diskussion anfachen, die für mich so wie so noch zu weit führen würde. bin doch noch ganz am anfang mit c++. :rolleyes:

aber hat nicht jeder mal klein angefangen. ich finde es recht schwierig sich diese programmiersprache autodidaktisch, nur mit büchern, beizubringen.

deshalb finde ich so was hier nicht ganz passend...

Ja aber du solltest dich glaube ich erst nochmal mit dem "doofen Stern" beschäftigen und was er bedeutet...und wo der unterschied zwischen void und void* ist.

... ich bin da für jede hilfe dankbar.

ich ddenke aber schon, dass ich weiß wofür diese worte stehen.

vieleicht hab ich das auch falsch verstanden, berichtigt mich wenns nicht stimmt.

void --> funktion ohne rückgabe

void* --> zeiger auf einen typ oder funktion

ich finde es ziemlich schwierig das alles aus büchern nach zu vollziehen, vor allem wenn man so übungen aus einem buch machen soll, woraus man bis dato keinen praktischen nutzen sieht.

gruß

pit

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich finde es ziemlich schwierig das alles aus büchern nach zu vollziehen, vor allem wenn man so übungen aus einem buch machen soll, woraus man bis dato keinen praktischen nutzen sieht.

Wenn Dir Bücher alleine zu trocken sind (was nichts negatives ist), dann brauchst Du zusätzlich eine andere Art der aktiveren Fortbildung (Schulung, Unterricht) und Übungsaufgaben, die Du selbst bearbeitest und zu denen Du Fragen stellen kannst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...