Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Funktionspointer dereferenzieren... oder doch nicht?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
16.01.2008, 15:43 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Bei folgendem Beispiel

C++:
#include <stdio.h>

void foo()
{
    printf ("OK\n");
}
typedef void (*TEST)();  

int main()
{
    TEST t = foo;

    foo();
    t();
    (*t)();

    getchar();
    return 0;
}  


Wird 3 mal OK ausgegeben, aber warum? Müsste nicht entweder t(); oder (*t)(); einen Fehler verursachen?


Bearbeitung:

Hab mal gültiges C draus gemacht (Funktionsaufruf und deklaration vertauscht), Beispiel bleibt aber sonst gleich


Dieser Post wurde am 16.01.2008 um 16:47 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.01.2008, 15:53 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,

funktionspointer arbeiten "relaxter", da er intern ja da auch nur einen call auf eine Speicheradresse macht,

dereferenzieren ist da überflüssig und wird wohl einfach akzeptiert. Ist bestimmt auch irgendwo festgeschrieben warum das funktioniert wie es funktioniert.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.01.2008, 16:01 Uhr
Hans
Library Walker
(Operator)


Hi,

ist das C89 oder C99?

Mein zugegeben etwas betagter Borland-compiler meldet hier:

C++:
TEST t = foo;  



Zitat von Borland C++ 5.5:

Error E2140: Declaration is not allowed here in function main



Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.01.2008, 16:08 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von FloSoft:

dereferenzieren ist da überflüssig

ja ich hatte es bisher auch immer ohne dereferenzierung gemacht und mich jetzt in nem anderem Forum darüber gewundert...


@Hans
uhm hab das mit Visual Studio 2005 und als .cpp Programm übersetzt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.01.2008, 16:34 Uhr
Hans
Library Walker
(Operator)



Zitat von Guybrush Threepwood:
@Hans
uhm hab das mit Visual Studio 2005 und als .cpp Programm übersetzt

Ah ja. Als cpp nimmt er es bei mir jetzt auch ohne zu meckern. Das Programm spuckt auch 3 mal OK aus, aber frag mich nicht, warum. Funktionspointer sind so ein Thema, mit dem ich mich noch nicht wirklich befasst habe

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 16.01.2008 um 16:36 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.01.2008, 17:15 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Das Lustige ist das

C++:
(*foo)();


ebenfalls funktioniert wie ich gerade probiert habe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.01.2008, 18:02 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ja denke das kommt daher das pointer ja eigentlich nur vom compiler ausgewertet werden, funktionen ja aber allgemein eine adresse nur darstellen:


C++:
0x45453453 push ... ;  int foo(int) {
...
...
ret ; }

0x45364564 call 0x45453453 ; foo(15);
0x45366666 call 0x45453453 ; *(foo)(15);



weil dereferenzieren von einer funktionsadresse gibt was? na? eine funktionsadresse ;-)
--
class God : public ChuckNorris { };

Dieser Post wurde am 16.01.2008 um 18:02 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.01.2008, 19:24 Uhr
xXx
Devil


hmm ... www.newty.de/fpt/index.html und meiner Meinung nach, ist die wirklich korrekte Form der Funktionszeigerzuweisung und Nutzung auch anders:

C++:
#include <stdio.h>

void foo()
{
    printf ("Ok!\n");
}

typedef void (*fnPtr)();  

int main()
{
    fnPtr ptr_foo = &foo;

    foo();
    (*ptr_foo)();

    getchar();
    return 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.01.2008, 02:21 Uhr
0xdeadbeef
Gott
(Operator)


Beide Schreibweisen sind völlig in Ordnung. Der Borland-Compiler ist alt und kaputt, und es sollte mich nicht wundern, wenn der den kompletten Standard noch nicht unterstützt. (Der ist, wenn ich mich recht entsinne, von 1993 oder so)
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.01.2008, 07:56 Uhr
Hans
Library Walker
(Operator)


Hi,
welchen Standard meinst Du jetzt? - Den C++ Standard?? - Der ist von 1998.

Der Compiler ist von 2000 und dem fehlt noch die Unterstützung von ein paar template-funktionen, die im Standard beschrieben sind.

Was das obige Programm angeht: wie ich eben gesehen habe, hat Flo in dem Beispiel zwei Zeilen vertauscht; wenn ich dem Borland-compiler die so geänderte Version vorsetzte, spuckt er zwar drei mal die Warnung aus, das da eine Funktion ohne Prototyp aufgerufen wird, nimmt es ansonsten aber als .C-Datei an. Das gibt dann auch 3 mal OK aus. Demnach scheint der Compiler in diesem Punkt in Ordnung zu sein.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: