mikrocontroller.net

Forum: PC-Programmierung Funktionspointer im Struct in C


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Claus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

welche Vorteile/Nachteile haben Funktionspointer in einem Struct (in C).
Ich wusste bisher gar nicht, dass so etwas geht.


Claus

Autor: Walter T. (nicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort: Virtual function table / vtable. In manchen Fällen ganz 
nützlich.

Im Extremfall kann man damit auch echte objektorientierte Programmierung 
in C betreiben.

: Bearbeitet durch User
Autor: Nop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachteil speziell für embedded: der Stackbedarf geht dann nicht mehr mit 
dem statischen Calltree zu ermitteln.

Autor: x^2 (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bis auf die standardmäßige Sichtbarkeit der Elemente unterscheiden sich 
class und struct nicht. Insofern entsprechen die Funktionspointer im 
struct virtuellen Methoden einer Klasse, mit der Einschränkung dass 
"this" als zusätzliches Argument ausgeführt werden müßte.

Häufig nützlich um in C Komponenten zu entkoppeln: Also wenn man z.B. 
ein Modul B nicht fest mit einem Modul A koppeln möchte, indem aus B 
direkt die Funktionen von A aufgerufen werden. Das struct definiert dann 
die geforderte Schnittstelle von B.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Claus schrieb:
> welche Vorteile/Nachteile haben Funktionspointer in einem Struct (in C).

Vor- und Nachteile im Vergleich zu was?

> Ich wusste bisher gar nicht, dass so etwas geht.

Warum sollte das nicht gehen? Jeder vollständige Typ kann Element einer 
struct sein.

Autor: A. S. (achs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Claus schrieb:
> welche Vorteile/Nachteile haben Funktionspointer in einem Struct (in C).
> Ich wusste bisher gar nicht, dass so etwas geht.

Structs fassen Element zusammen, die zusammen gehören. Sinnvoll ist das 
um
- Funktionen und Daten
- verschiedene Funktionen eines Moduls oder eines Datentyps
zusammen zu fassen


Nop schrieb:
> Nachteil speziell für embedded: der Stackbedarf geht dann nicht mehr mit
> dem statischen Calltree zu ermitteln.
Das hat aber nichts damit zu tun, ob fPointer in Structs oder Arrays 
gruppiert werden.

Autor: MaWin (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Walter T. schrieb:
> Im Extremfall kann man damit auch echte objektorientierte Programmierung
> in C betreiben.

x^2 schrieb:
> Bis auf die standardmäßige Sichtbarkeit der Elemente unterscheiden sich
> class und struct nicht. Insofern entsprechen die Funktionspointer im
> struct virtuellen Methoden einer Klasse

Das ist wieder einmal totaler Blödsch....!

Einen Funktionspointer musst du bei/nach der Instanzierung 
initialisieren. Bei Methoden kümmert sich dein Tool darum. Das weiss 
auch nach mehrfachen Vererbungen, was zusammen gehört. Auch verwaltet es 
die virtuellen Mehtoden und kann über ein und denselben Pointer 
unterschiedliche Objekte und deren virtuelle Methoden zusammen würfeln.

Habt ihr OOP überhaupt verstanden?

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> Auch verwaltet es
> die virtuellen Mehtoden

Ja, VMT zur Laufzeit, für die Klugsch...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> Das ist wieder einmal totaler Blödsch....!

Es geht hier ausdrücklich um C, nicht um C++.
Steht es zur Verfügung, ist C++ der meist bessere Weg.

MaWin schrieb:
> Ja, VMT zur Laufzeit, für die Klugsch...

C++ macht da auch viel zur Laufzeit. Sieht man nur nicht. Das obige 
Schema lässt sich auch locker mit einer VMT erweitern, um die 
Initialisierungen zu reduzieren. Oder indem man die Objekte aus einem 
statischen Template kopiert.

: Bearbeitet durch User
Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Es geht hier ausdrücklich um C, nicht um C++.

Es wurde von OOP gesprochen. Und darauf beziehe ich mich. Die Jungs 
haben Nonsens gesch...

Autor: MaWin (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
A. K. schrieb:
> Das obige
> Schema lässt sich auch locker mit einer VMT erweitern

Zeig' bitte mal was Lockeres. Ich bin gespannt, wie locker du hier ein C 
Beispiel mit einer funktionierenden VMT einstellst.

Auf geht 's! Oder bist du nur ein sprüchklopfendes Großmaul?

Autor: mh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> ...

guck dir mal gobject an.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> Oder bist du nur ein sprüchklopfendes Großmaul?

Hab keine Lust auf diesen Stil, egal wie du mich nennst. Von Compilern 
hatte ich mal etwas Ahnung, bissel was ist davon noch übrig geblieben.

: Bearbeitet durch User
Autor: MaWin (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
A. K. schrieb:
> Ahnung

Na was jetzt? Große Ankündigung und nun kneifen! Wo ist das lockere 
Beispiel?

Es geht wohl nicht so locker? Natürlich nicht, C ist keine OOP-taugliche 
Sprache!

Autor: Walter T. (nicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> Das ist wieder einmal totaler Blödsch....!
>
> Einen Funktionspointer musst du bei/nach der Instanzierung
> initialisieren. Bei Methoden kümmert sich dein Tool darum. Das weiss
> auch nach mehrfachen Vererbungen, was zusammen gehört. Auch verwaltet es
> die virtuellen Mehtoden und kann über ein und denselben Pointer
> unterschiedliche Objekte und deren virtuelle Methoden zusammen würfeln.
>
> Habt ihr OOP überhaupt verstanden?

Objektorientierung ist ein Programmierparadigma, kein syntaktischer 
Zucker, den die Programmiersprache der Wahl bereitstellt, um das 
einfacher zu machen.

Hast Du OOP überhaupt verstanden?

Autor: Nop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter T. schrieb:

> Objektorientierung ist ein Programmierparadigma, kein syntaktischer
> Zucker, den die Programmiersprache der Wahl bereitstellt, um das
> einfacher zu machen.

Zumal Alan Kay, als er den Begriff erfand, damit keineswegs meinte, 
Daten und Funktionen in einem aufgebohrten struct abzulegen. Eigentlich 
ging es dabei um das Konzept von Akteuren, die miteinander nur durch 
eine Message-Schnittstellen kommunizieren.

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Autor: MaWin (Gast)
> Datum: 08.11.2019 21:08
> Autor: MaWin (Gast)
> Datum: 08.11.2019 21:09
> Autor: MaWin (Gast)
> Datum: 08.11.2019 21:27
> Autor: MaWin (Gast)
> Datum: 08.11.2019 21:32
> Autor: MaWin (Gast)
> Datum: 08.11.2019 22:05

Der Psychopath, der seinen Namen nicht kennt und stattdessen MaWin ins 
Namensfeld schreibt, dreht mal wieder völlig am Rad.
Also Leute, der Müll kam nicht von mir.

Autor: Mr. Meeseeks look at me (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: A. F. (artur-f) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> Es wurde von OOP gesprochen. Und darauf beziehe ich mich. Die Jungs
> haben Nonsens gesch...

Natürlich geht OOP auch in C und da helfen die structs.

Autor: Eric B. (beric)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich mach' OOP am liebsten in Z80 Assembly duck-und-wech

Autor: x^2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> Auch verwaltet es
> die virtuellen Mehtoden und kann über ein und denselben Pointer
> unterschiedliche Objekte und deren virtuelle Methoden zusammen würfeln.

MaWin schrieb:
> Das ist wieder einmal totaler Blödsch....!

Autor: Marten Morten (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Claus schrieb:
> welche Vorteile/Nachteile haben Funktionspointer in einem Struct (in C).

Weder noch. Die Möglichkeit existiert erst einmal ganz neutral. Der 
Verwendungskonext entscheidet. Wenn das Verwenden in einem konkreten 
Fall mehr Probleme löst als neue schafft sind sie von Vorteil.

Autor: MaWin (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
MaWin schrieb:
> Der Psychopath, der

Off Topic? Beleidigend?

@Mods: So wollt ihr das Forum?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.