- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Callback Funktion mit static function pointer

  1. #11
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.12.2005
    Ort
    @FFM
    Alter
    48
    Beiträge
    408
    Anzeige

    Praxistest und DIY Projekte
    Danke ....

    Ich weiß das solche Probleme für andere ein Witz sind. Und das für mich das Konzept der Sprache C nicht gerade schlüssig ist merkt mann ja.
    Ich entwickle hauptsächlich unter vb.net und in meiner Welt gibt es keinen Code Außerhalb von Klassen und Methoden. Auch Zugriff auf
    Funktionen in anderen Klassen etc mach ich über den Namespace da brauch ich keinen callback für , es sei denn mal nen invoke.

    Behaltet bitte im Hinterkopf daß hier nicht nur Profis hinterm PC sitzen . Schließlich ist ein Forum hauptsächlich da zu helfen und nicht
    den Wissensstand eurer Mitmenschen zu kritisieren.

    Trotzdem bin Ich froh das du mir die Lösung gezeigt hast ... da wär ich nie drauf gekommen...

  2. #12
    shedepe
    Gast
    Auch .Net kennt das Konzept von Callbacks. Nennt sich nur Delegates dort. Auf Funktionen aus anderen Klassen kannst du auch unter .Net nicht anders zugreifen als unter C++.

    Ich wollte nur darauf hinweisen, dass man manchmal durch googlen auch weiterkommen kann. Gerade bei so Standardthemen. Dazu gibt es ja zig tausende Tutorials
    Auf der anderen Seite sind C Style Callbacks echt unschön. Unter C++11 am PC kann man das mit std::function viel schöner machen.

  3. #13
    HaWe
    Gast
    Zitat Zitat von shedepe Beitrag anzeigen
    Auch .Net kennt das Konzept von Callbacks. Nennt sich nur Delegates dort. Auf Funktionen aus anderen Klassen kannst du auch unter .Net nicht anders zugreifen als unter C++.

    Ich wollte nur darauf hinweisen, dass man manchmal durch googlen auch weiterkommen kann. Gerade bei so Standardthemen. Dazu gibt es ja zig tausende Tutorials
    Auf der anderen Seite sind C Style Callbacks echt unschön. Unter C++11 am PC kann man das mit std::function viel schöner machen.
    ist Arduino nicht ebenfalls C++(11) ?
    warum geht das dann da nicht auch "viel schöner"?

  4. #14
    shedepe
    Gast
    aja. Eine std::function und std::bind (was man braucht um eine Klassen funktion an eine std::function zu binden) sind meines Wissens nach etwas fett für die typischen Arduino Plattformen, da dort noch einiges mehr implementiert wird als eine reine Callback funktion.
    Das ist zwar sehr praktisch da man Type Checks, checks auf Null usw. dazu bekommt, auf der anderen Seite braucht man wesentlich mehr Speicher (Was auf dem PC nicht stört), und der Funktionsaufruf dauert ein kleines bisschen länger.

    Edit. Der vollständigkeit halber: https://blog.demofox.org/2015/02/25/...f-stdfunction/

  5. #15
    HaWe
    Gast
    Zitat Zitat von shedepe Beitrag anzeigen
    aja. Eine std::function und std::bind (was man braucht um eine Klassen funktion an eine std::function zu binden) sind meines Wissens nach etwas fett für die typischen Arduino Plattformen, da dort noch einiges mehr implementiert wird als eine reine Callback funktion.
    Das ist zwar sehr praktisch da man Type Checks, checks auf Null usw. dazu bekommt, auf der anderen Seite braucht man wesentlich mehr Speicher (Was auf dem PC nicht stört), und der Funktionsaufruf dauert ein kleines bisschen länger.

    Edit. Der vollständigkeit halber: https://blog.demofox.org/2015/02/25/...f-stdfunction/
    ok, fetter Speicher verstehe ich, aber der Rest mit C++ std::function ist doch weit jenseits dessen was ich kapiere...

  6. #16
    shedepe
    Gast
    Ich versuch es dir spaßeshalber ein bisschen näher zu bringen.
    Dazu muss man sich bewusst werden wie Funktionen bei C oder C++ im Speicher liegen. Zum einen gibt es Funktionen die außerhalb einer Klasse sind. Das sind ganz normale C Funktionen die irgendwo im Speicher liegen. Darauf einen Funktionspointer zu machen ist sehr einfach, weil man muss wirklich nur wissen: Wo liegt die Funktion. Da kommen wir aber schon zum ersten Problem. Normalerweise prüft der Compiler: Passen die Argumente die du angibst zu der Funktion. Bei Funktionspointer kannst du das umgehen wenn du willst.

    Dazu auch noch eine nette Anmerkung: Man kann auch spaßeshalber hingehen und den Speicher in dem eine Funktion liegt durch eine andere Funktion zur Laufzeit überschreiben. Wenn man dann die ursprüngliche aufruft ruft man in wirklichkeit die überschriebene auf .

    Aber nun der eigentliche Grund für std::function. Die zweite Art von Funktion die wir in C++ haben können sind Klassenfunktionen (Die man dann eigentlich Methoden nennt). Wenn wir jetzt eine Klasse A haben:

    Code:
    class A
    {
        public:
           int a;
           void do_something_on_a(){a++;}
    };
    Dann stellen wir fest es gibt zum einen Daten in einer Klasse, zum anderen Funktionen die auf den Daten arbeiten. Der Compiler geht hin und legt für jede Klasse einmal Speicher an in dem die ganzen Funktionen liegen. Die Daten werden jetzt aber für jede Instanz getrennt angelegt. D.h. jedes mal wenn wir A* neueInstanz = new A() machen. Wird Speicher für die Variable a reserviert. Wenn wir jetzt neueInstanz->do_something_on_a() aufrufen. Dann baut der Compiler eigentlich einen Aufruf zusammen in dem er die Funktion do_something_on_a() mit der entsprechenden Instanz aufruft.

    Wenn du jetzt aber versuchst einen Funktionspointer auf do_something_on_a zu erstellen würde der ja in C-Style Syntax so aussehen: (Wenn ich nen Syntaxfehler drin hab kann sein. Bin was C-Style Funktionspointer anbelangt nicht so fit was die Syntax angeht)
    Code:
    (void) (*func)();
    Das Problem dabei ist aber: Da ist nicht die Instanz mit eingebaut auf der die Methoden arbeiten soll. Man kann das zwar mit integrieren. Bringt aber weitere Probleme mit sich nämlich z.B. dass unterschiedliche Compiler funktionen unterschiedlich aufrufen. D.h. der Code ist plötzlich nicht mehr auf einer anderen Plattform lauffähig. (Und man kann die Typenprüfung umgehen wenn man will) (Das exakte kann man hier nachlesen: http://www.newty.de/fpt/fpt.html#defi)

    Deshalb hat C++11 das std::function template mitgebracht. Damit kann man Plattformunabhängig Pointer auf Memberfunktionen erstellen und aufrufen und die Syntax ist viel netter.

  7. #17
    HaWe
    Gast
    aaah, super, dankeschön, DAS habe ich kapiert!

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 17.02.2016, 21:09
  2. static inline ? warum static
    Von Siro im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 22.12.2010, 14:41
  3. Function Pointer - Verständnissproblem
    Von s.o. im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 01.05.2008, 10:34
  4. Static int Problem
    Von Spongebob85 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 20.01.2007, 00:25
  5. static beisst volatile
    Von StefPan im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 02.10.2006, 18:54

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests