Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

: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ß

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.

  • Autor

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

  • Autor

Das gibts doch nicht, das lag nur an dem doofen Stern!?!?!?

Mann mann, danke!

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?

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.

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.

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.

  • Autor

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

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.

  • Autor

ja, da hast du schon recht.

das problem ist nur das solche sachen sehr teuer sind.

aber ich glaube so eine diskussion gehört hier auch nicht hin.

darüber könnte per pm schreiben.

wenn du da tips für mich hast meil mich an.

pit

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.