Mal wieder Frage :D Zeiger
-
Zu 2.
Pointer sehen Programmtechnisch alle gleich aus. Das ist einfach eine 32-Bit-Zahl die an eine Stelle im Speicher zeigt.
Das bennen von Pointern dient lediglich deinem Compiler das er dich auf Fehler hinweisen kann.
Auch ein Typcast zwischen Pointern sollte IMHO im generierten Code an dieser Stelle nichts ändern.
-
So, ich komm doch nich drum rum, nochmal nachzufragen, sorry.
Ich wollt den Pointer jetzt im Programm einbauen, ich bekomm aber 4 Fehlermeldungen vom Compiler zurück. Folgender recht unsinniger Code war natürlich ein Test. Trotzdem sollte er laufen.int f_msgbox(void*,void*) { MessageBox(NULL,"test","test",MB_OK); return(1); } ..... int (*ptFunc[5]) (void*,void*); ptFunc[0] = f_msgbox;
-
Hi !
Welche Fehlermeldungen denn ??
-
Ich vermute mal, Du wolltest es als Windows-Programm kompilieren, wegen des
Message-Box-Aufrufs.
Dann ist es einfach nur ein Deklarationsfehler, schätze ich jetzt einfach mal ganz grob, denn wenn man es für ne Konsolenanwendung umschreibt, dann funzt das nämlich supi dupi.[cpp]
#include <iostream.h>int f_msgbox1(void*,void*)
{
cout << "Test 1" << endl;
return 1;
}int f_msgbox2(void*,void*)
{
cout << "Test 2" << endl;
return 1;
}int f_msgbox3(void*,void*)
{
cout << "Test 3" << endl;
return 1;
}
int (*ptFunc[3]) (void*,void*);void main(int argc, char* argv[])
{
ptFunc[0] = f_msgbox1;
ptFunc[1] = f_msgbox2;
ptFunc[2] = f_msgbox3;ptFunc[0](NULL, NULL);
ptFunc[1](NULL, NULL);
ptFunc[2](NULL, NULL);
}

-
:\Programme\Microsoft Visual Studio\MyProjects\rtx\main.cpp(63) : error C2466: Reservierung eines Feldes der konstanten Groesse 0 nicht moeglich C:\Programme\Microsoft Visual Studio\MyProjects\rtx\main.cpp(63) : error C2501: 'ptFunc' : Fehlende Speicherklasse oder Typbezeichner C:\Programme\Microsoft Visual Studio\MyProjects\rtx\main.cpp(63) : error C2373: 'ptFunc' : Neudefinition; unterschiedliche Modifizierer C:\Programme\Microsoft Visual Studio\MyProjects\rtx\main.cpp(62) : Siehe Deklaration von 'ptFunc' C:\Programme\Microsoft Visual Studio\MyProjects\rtx\main.cpp(63) : error C2440: 'initializing' : '' kann nicht in 'int []' konvertiert werden Es gibt keine Konvertierungen von Feldtypen, obwohl es Konvertierungen von Verweisen oder Zeigern in Felder gibt Fehler beim Ausführen von cl.exe.
-
Will aber mit Windows arbeiten

-
Hast Du denn die Funktion auch C++ Style like deklariert ?
-
hhmmmm..als Konsolenproggie läuft es, aber als Windowsprog. bekomme ich eine Fehlermeldung:
ompilierung läuft...
StreamDlg.cpp
C:\Stream\StreamDlg.cpp(224) : error C2440: '=' : 'int (__thiscall CStreamDlg::*)(void *,void *)' kann nicht in 'int (__cdecl *)(void *,void *)' konvertiert werden
Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist
Generieren von Code...
Kompilieren...
Stream.cpp
Generieren von Code...
Fehler beim Ausführen von cl.exe.Stream.exe - 1 Fehler, 0 Warnung(en)
kann ich im Moment gar nix mit anfangen

-
Was bedeutet für dich "C++ style-like"?
Oben ist ja die Funktion. Wenn du Klassen meinst, so habe ich nicht vor, mit Klassen zu arbeiten, wenn diese nicht dringend notwendig wären. Ich will einfach nur meinen Funktionszeiger zum Laufen bekommen.
-
Ja, genau das habe ich gemeint
-
Ich kann mir aber beim besten Willen nich vorstellen, dass es einfache Funktionszeiger nur in Konsolenanwendungen gibt
Wer kann helfen?
-
Das kann ich mir genausowenig vorstellen, weiss aber im Moment leider keinen Rat.
-
Jepp !! Es geht, was beide Versionen betriff. C++ like und auch im C Stil
im C Stil kann man die Funktionsdefinition in eine Headerdatei auslagern.Wenn man nen Zeiger auf ne Elementfunktion richtet, dann wird die Syntax schon ein wenig ungewohnt, wie ich finde.
Aber erstmal im C Stil, ausgelagerte Headerdatei:
// Global.h
[code] bool GlobalCplusplusFlegelStyle (void*, void*) // Funktiosdefinition { AfxMessageBox("Hi there!"); return (1+1 != 2); }[/code]
Dann, irgendwo in deinem Proggie:#include Global.h
.....
[code] bool (*ptFunc)(void*, void*); // Zeiger auf Funktion mit Rückgabtyb bool deklarieren ptFunc = GlobalCplusplusFlegelStyle; // Zeiger auf Funktion richten bool b = ptFunc(NULL, NULL); // Funktionsaufruf[/code]
..........
// funzt***************************************************
Jetzt in C++ :
/*
Deklariert in StreamDlg.h:
.....[code] public: int MsgBox(void*, void*); // Deklaration der Memberfunktion private : int (CStreamDlg::*ptFunc) (void*, void*); // Deklaration des Zeigers auf Member-Funktion mit Rückgabetyp int[/code]
.....
*//*
Definiert in StreamDlg.cpp:
.......[code] int CStreamDlg::MsgBox(void *, void *) { AfxMessageBox("Geht doch ;-)"); return 1; }[/code]
.....
*/// Jetzt noch der Code um die Fkt aufzurufen
......[code] CStreamDlg dlg; // Ermöglicht Zugriff auf privaten Zeiger auf Funktion ptFunc = CStreamDlg::MsgBox; // Zeiger auf Member-Funktion richten (dlg.*ptFunc)(NULL, NULL); // Funktion aufrufen ....... // funzt[/code]
Jooo, jetzt kann man auch, wenn man lustig ist, für beide Versionen mehrere Funktionen schreiben und diese dann in ein Array packen ,oder was auch immer.So, jetzt hab ich mir nen Kaffee verdient *sichmalaufdieschulterklopft*, prost !!
-
Also entweder bin ich komplett beschränkt, oder es stimmt etwas nicht. Ich hatte die Funktion sowieso schon in einem Header ausgelagert, ich habs jetzt nochmal genauso gemacht, wie du es gesagt hast. Header mit Funktion, Header includet, Pointer definiert und zugewiesen. Immernoch die verdammten Fehler. Linkst du noch irgendeine Lib oder Standard-Include hinzu, damit das unterstützt wird? Ich komm kein Deut weiter.

Naja danke, ich probiers jetz mal mit der Klassen/C++ Variante

-
Nö, keine weiteren includes
-
Der Code zum Beispiel funktioniert jetz:
typedef int (*ptFunc) (void*,void*); ptFunc func = globalmsgbox;Der allerdings nicht:
typedef int (*ptFunc) (void*,void*); ptFunc func; func = globalmsgbox;Verrückt oder? Man müsste doch davon ausgehen, dass beide Varianten funktionieren. Leider bin ich auf die zweite angewiesen, da ich einen Funktionszeiger-Array bräuchte. Gibt es einen Profi der helfen kann?
-
Bei Deinem letzten Posting, beiden Codebeispiele, da sehe ich keinen Unterschied.
Was willst Du eigentlich mit dem typedef davor ?? *grübel*
Profi...keine Ahnung, kenne ich keinen, ausser das eine oder andere Nachschlagewerk;Guckst Du hier:
http://www2.pmf.fh-goettingen.de/~awolf2/mfc/ressourcen/c++21/data/kap14.htm#776713
-
ps, keinen funktionellen Unterschied *g*
-
Besides, was willstn mit nem Profi, wenns bei mir läuft, dann sollte es doch wohl auch auf nem anderen Rechner zum Laufen zu kriegen sollen tun sein oder net.
-
Was heißt Profi, jemand ders halt kapiert

Danke für den Text, ich les es morgen durch, heut nacht wird das nix mehr mit dem Kopf
Ja die beiden obigen Beispiele machen keinen sinnvollen Unterschied, ich war nur fasziniert, dass der eine geht, der andere nicht. Das typedef brauch ich, um aus dem Pointer anschließend einen Array zu machen.