Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ C / C++ (ANSI-Standard) » Zeiger auf Funktionen

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 <
000
10.01.2003, 15:39 Uhr
void*
Generic Pointer
(Operator)


In einer Anwendung sind z.B. Funktionen bei denen ein Parameter die Adresse einer Callbackfunktion ist oder die Funktion atexit die als Parameter die Adressen von Funktionen bekommt, die beim Aufruf von exit ihrerseits aufgerufen werden.

1. Adresse einer Funktion Der Name einer Funktion (also ohne Klammern) steht für ihre Adresse.
Beispiel:

C++:
int myfunc(char a, float x); = > // myfunc ist die Adresse.


2. Definition eines Zeigers auf eine Funktion
Rückgabetyp (*Zeigername)(Parameterliste);
Beispiel:

C++:
int(*func)(char ,float);


Dies ist ein Zeiger auf eine Funktion mit Rückgabewert int, einem char und einem float Parameter. Nun könnte man also dies schreiben:

C++:
func=myfunc;


Und nun über

C++:
func('c', 4.32);


myfunc
aufrufen. Oft wird auch

C++:
(func)('c',4.32)


geschrieben, um zu verdeutlichen, daß der Aufruf über einen Zeiger erfolgt. Dies ist jedoch nur eine stilistische Frage. Zu all dem noch ein lauffähiges Beispiel:

C++:
#include <stdio.h>
#include <conio.h>
/* Diese Funktion macht eine Textausgabe */

void output(int a)
{
    printf("Sie haben %i uebergeben.\n",a);
}

/* Diese Funktion addiert zwei float Werte */
float plus(float a, float b)
{
    return(a+b);
}

/* Diese Funktion subtrahiert zwei float Werte */
float minus(float a, float b)
{
    return(a-b);
}
/* Nun der interssante Teil. Diese Funktion liefert je nach dem Wert von
   selection* einen Zeiger auf die Funktion plus, die Funktion
   minus oder NULL zurück. Der * Rückgabewert ist ein Zeiger auf
   eine Funktion die float zurückgibt und 2 float* Parameter hat. */

float (*retfloat(int selection))(float, float)
{
    printf("retfloat wurde aufgerufen!\n");
    switch(selection)
    {
    case 0: return(plus);
    case 1: return(minus);
    default: return(NULL);
    }
}

int main(void)
{
    double x=3.22424, y=1.3234, result;
    int z=33, count;
    /* Definition zweier Zeiger auf Funktionen */
    void (*fkt)(int);
    float (*fkt2)(float, float);
    /* fkt wird die Adresse der Funktion output zugewiesen
    und dann wird output * über fkt aufgerufen */

    fkt=output;
    fkt(z);
    /* retfloat() wird mit 3 verschiedenen Werten aufgerufen und
    liefert * verschieden Pointer bzw. NULL zurück */

    for(count=0; count<3; count++)
    {
        fkt2=retfloat(count);
        if(fkt2!=NULL)
        {
            result=fkt2(x,y);
            printf("Das Ergebnis ist: %f\n", result);
        }
        else
            printf("Das war 'ne NULL!\n");
    }
    getch();
    return(0);
}


--
Gruß
void*

Dieser Post wurde am 10.01.2003 um 15:47 Uhr von void* editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ FAQ 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: