Zeiger auf Funktion als Rückgabewert



  • ja, das mit dem void* hatte ich bisher, bloss dann kommen etliche meldungen:

    warning C4152: Nicht dem Standard entsprechende Erweiterung, Konvertierung von Funktions-/Datenzeiger im Ausdruck

    was sehr störend ist.

    das mit dem typedef funktioniert bestens,
    ich danke dir!



  • ^^ohne typedef sieht so eine funktion auch echt gruselig aus

    void func1 (void)
    {
      puts ("hello");
    } 
    
    // 1. void: rueckgabewert von func1
    // 2. void: parameter von gib_zeiger
    // 3. void: parameter von func1
    void (*gib_zeiger(void))(void)
    {
      return func1;
    }
    
    void main (void)
    {
      void (*p)(void) = gib_zeiger();
      p();
    }
    

    🙂



  • +fricky schrieb:

    ^^ohne typedef sieht so eine funktion auch echt gruselig aus

    void func1 (void)
    {
      puts ("hello");
    } 
    
    // 1. void: rueckgabewert von func1
    // 2. void: parameter von gib_zeiger
    // 3. void: parameter von func1
    void (*gib_zeiger(void))(void)
    {
      return func1;
    }
    
    void main (void)
    {
      void (*p)(void) = gib_zeiger();
      p();
    }
    

    🙂

    👍

    ich kann mir die deklaration der funktionszeiger als parameter einfach nicht merken 🙄



  • funcptr n00b schrieb:

    ich kann mir die deklaration der funktionszeiger als parameter einfach nicht merken

    tröste dich, eine funktion die 'nen fptr zurückgibt, schreibt ohne typedef so gut wie keiner aus dem stegreif richtig hin.
    🙂



  • funcptr n00b schrieb:

    ich kann mir die deklaration der funktionszeiger als parameter einfach nicht merken 🙄

    Einfach von innen nach außen lesen (bzw. hinschreiben), wobei ohne explizite Klammern Dinge auf der rechten Seite Vorrang vor Dingen auf der linken Seite haben:

    void (*gib_zeiger(void))(void)
    

    - In der Mitte steht gib_zeiger, also wird etwas namens gib_zeiger deklariert.
    - Rechts davon steht (void), also ist gib_zeiger eine Funktion ohne Parameter.
    - Links davon steht ein Sternchen, also liefert die Funktion gib_zeiger einen Zeiger auf irgendetwas.
    - Rechts davon steht (void), also ist das, auf das der Rückgabewert von gib_zeiger zeigt, eine Funktion ohne Parameter.
    - Links davon steht void, also gibt diese Funktion wiederum nichts zurück.

    Ist also gar nicht so schwer 🙂



  • ^^namespace invader: gute erklärt.
    http://www.ceng.metu.edu.tr/~ceng140/c_decl.pdf
    🙂



  • hi!
    soweit so gut, es läuft, aber mit ner warnung:

    void func (void)
    {
    	return;
    }
    
    void (*func_ptr (char* s)) (void)
    {
    	s = NULL;
    	return func;
    }
    

    warning: Ausdruck wird als Funktion ausgewertet, der eine Argumentliste fehlt

    und zwar wird das return func; angemeckert. was soll das und muss ich das ernst nehmen ?



  • Anscheinend eine etwas übertriebene Warnung vom Microsoft-Compiler. Vielleicht geht sie weg, wenn du stattdessen &func returnst (was aber eigentlich nicht notwendig ist).



  • namespace invader schrieb:

    Anscheinend eine etwas übertriebene Warnung vom Microsoft-Compiler. Vielleicht geht sie weg, wenn du stattdessen &func returnst (was aber eigentlich nicht notwendig ist).

    Bist Du ganz sicher?
    Eigentlich müßte func den Einsprungvektor auf func() liefern, &func die Adresse, wo der Einsprungvektor liegt.
    Das Problem dürfte folglich woanders liegen, kann aber auch sein, daß ich mich irre ...



  • pointercrash() schrieb:

    Eigentlich müßte func den Einsprungvektor auf func() liefern, &func die Adresse, wo der Einsprungvektor liegt.

    nee.
    func==&func.



  • namespace invader schrieb:

    Anscheinend eine etwas übertriebene Warnung vom Microsoft-Compiler. Vielleicht geht sie weg, wenn du stattdessen &func returnst (was aber eigentlich nicht notwendig ist).

    tolle warnung.
    ich schreib nämlich immer

    cout<<time<<endl;
    

    und so nen quatsch. und die warnung sagt mir, daß ich wiedermal die klammern vergessen habe.



  • pointercrash() schrieb:

    Eigentlich müßte func den Einsprungvektor auf func() liefern, &func die Adresse, wo der Einsprungvektor liegt.

    normalerweise brauchen funktionen keinen 'einsprungvektor', ausser man macht sich selber einen, mit 'nem function pointer.
    🙂



  • namespace invader hat recht, wenn ich &func zurückgebe, ist die warnung weg.
    vllt. liegt es auch daran, das der compiler so alt ist ( autorenversion msvc++ 6.0 )



  • ^^is wohl ein bug im msvc. compilierst du als .c oder als .cpp? c und c++ function pointer sind irgendwie nicht das selbe.
    🙂



  • +fricky schrieb:

    ^^is wohl ein bug im msvc. compilierst du als .c oder als .cpp? c und c++ function pointer sind irgendwie nicht das selbe.
    🙂

    schätze auch, ist ein bug. ist ne alte version, ohne service packs.
    ich habe das als .c compiliert.



  • funcptr schrieb:

    schätze auch, ist ein bug. ist ne alte version, ohne service packs.

    kein bug. ne warnung.
    "warning: Ausdruck wird als Funktion ausgewertet, der eine Argumentliste fehlt"
    sagt auf deutsch
    "Warnung: Vermutlich hast du dummer N00b die Klammern vergessen"



  • ah, fetschehe!

    der 'denkt', das ich die funktion aufrufe.
    egal, kann denken was willer der n00b! hauptsache funzt correctly und schon bald kann mein programm in den nahezu unendlichen weiten des www verewigt werden 🙂

    mfg,
    funcptr n00b

    - nur echt mit zweimal ascii 48



  • volkard schrieb:

    kein bug. ne warnung.

    Trotzdem ist die Warnung in der Form verwirrend, denn das "fehlt" impliziert, dass dort eine Argumentliste hingehört. Wenn der Compiler nur empfehlen möchte, zur besseren Klarheit einen Adressoperator davorzuschreiben, könnte er das auch so sagen.

    Abgesehen davon dürften die meisten (wenn auch nicht alle) vergessenen Argumentlisten ohnehin durch den Typcheck oder "statement with no effect"-Warnungen erschlagen werden.



  • volkard schrieb:

    funcptr schrieb:

    schätze auch, ist ein bug. ist ne alte version, ohne service packs.

    kein bug. ne warnung.

    'ne unberechtigte warnung, weil der compiler zwischen 'func' und '&func' unterscheidet. 'adressen von adressen' gibts für C eigentlich nicht.
    🙂



  • dem msvc 2008 hamse die zicken abgewöhnt, glaub ich.


Anmelden zum Antworten