PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktionspointer...



ContainerDriver
02-07-2003, 11:34
Hallo,
ich habe folgendes Problem:

-----------------

void test(void)
{
cout << "Hallo" << endl;
}

int main(void)
{
void*temp=test;
(*temp)();
//Compiler: fkt_zgr.cpp:??:void VALUE IGNORED AS IT OUGHT TO BE

return 0;
}
----------------
Also, ich kann mit dem Pointer nicht die Funktion aufrufen.
1. Welcher Datentyp muss der Pointer auf die Funktion sein? (es muss ein Datentyp sein, den ich mit va_arg() auslesen kann)
2. Wie muss der eventuell richtige Aufruf für test lauten mit dem Pointer void*?


Vielen Dank für die Antwort

MFG

Florian

peschmae
02-07-2003, 13:17
codetags benutzen ([ code ] und [ / code ] bzw # - button)

MfG Peschmä

wraith
02-07-2003, 13:27
Funktionpointer


void (*temp)();

Gelesen mit der rechts-links Regel. temp ist ein Pointer auf eine Funktion ohne Parameter und Rückgabewert void.
Aufruf wie eine Funktion


temp();

almoeli
02-07-2003, 13:56
Hi,

auf zur munteren Typenkonvertierung. Folgendes Programm läuft und zeigt dir wie du die Typen verwenden kannst:



#include <iostream>
using namespace std;

void test(void)
{
cout << "Hallo" << endl;
}

int main(void)
{
void *test2 = (void *)test;
void(*temp)()=test;
temp();
((void (*)())test2)();

return 0;
}


Wie du siehst wird ein Pointer auf die Funktion mit



void(*temp)();


deklariert.
Einen Pointer auf eine Funktion kann man explizit in einen void * konvertieren (Zeile mit test 2 Deklaration). Um einen solchen void * wieder in einen Funktionspointer zu konvertieren ist der Konstrukt mit den vielen Klammern notwendig. Die reine Typenangabe lautet:



(void(*)())


Diesen Typ kannst du auch im va_arg angebenm bin mir aber nicht sicher ob das geht. Sonst void* übergeben und dann casten wie oben gezeigt.

Gruß

almoeli

wraith
02-07-2003, 14:06
Original geschrieben von almoeli

Einen Pointer auf eine Funktion kann man explizit in einen void * konvertieren (Zeile mit test 2 Deklaration)
Das ist nicht korrekt,Nur weil es läuft ist das kein Beweis ;).

C garantiert,das ein void Pointer auf jeden Objekttyp zeigen kann (konvertiert werden kann).
Aber da sind Funktionspointer ausgeschlossen.
Ich denke auf 99% aller Implementierungen wird es laufen,es ist aber nicht korrekt und nicht portabel.

almoeli
02-07-2003, 14:52
Hi,

oh ja, Asche auf mein Haupt. Eine Konvertierung von Pointer to Object und Pointer to Function ist laut C Standard nicht erlaubt. Könnte evtl. Probleme auf gewissen System geben, die für Daten und Code verschiedene Adressformate benutzen.

Strittig ist allerdings der reinterpret_cast unter C++ mit dem (fast) alles möglich ist, weil er jede Repräsentation als Bitmuster betrachtet und ihm damit egal ist, was das für ein Typ ist. Es wird allerdings dringend empfohlen einen Datentyp wieder zurück zu konvertieren bevor man ihn verwendet. Außerdem ist man selber dafür verantworlich, das bei der Konvertierung keine Daten verlorengehen. Auch unterstellt man dem reinterpret_cast keine Portabilität. Also mit höchster Vorsicht zu genießen.

Gruß

almoeli

tuxipuxi
02-07-2003, 15:38
ich stell mal eine doofe frage:
wozu soll denn so etwas gut sein? ich meine, wozu zeiger auf eine void funktion?

gruss,

tuxipuxi.

Boron
02-07-2003, 15:57
@tuxipuxi
Ein (zugegebenermassen konstruiertes) Beispiel:

-Stell dir vor du hast zwei verschiedene Variablen.
-Abhängig von Zustand beider Variablen sollst du eine Funktion ausführen. Bei 4 möglichen Zuständen pro Variable macht das dann 4*4 = 16 mögliche Kombinationen.
- Jetzt hast du (zufälligerweise :D) genau 16 versch. Funktionen.

1. Variante (du uncoole)
Du könntest jetzt mit vielen if-else Abfagen, und das ganze noch verschachtelt, alle 16 Kombinationmöglichkeiten testen und dann die entsprechende Funktion ausführen.

2. Variante (die coole:cool: )
Du machst eine 4x4 Matrix von Zeigern auf die Funktionen. und kannst dann mit matrix[var1][var2] supersteinfach die Funktionen aufrufen.

Zumindest konnte ich mal auf diese Weise meinen Prof an der FH positiv überaschen :).