Forum: PC-Programmierung Properties 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.
von Roth (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Kennt C sowas wie property get / property let?

Also sowas hier, nur in C

https://www.akademie.de/wissen/vba-prozeduren-parameter-optimieren/properties-statt-funktionen

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Das macht nur bei Objekten Sinn, die gibt es in C aber nicht.
Von was willst du denn Properties setzen?

: Bearbeitet durch User
von Roth (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Das macht nur bei Objekten Sinn, die gibt es in C aber nicht.
> Von was willst du denn Properties setzen?

Normal schon. Properties lassen sich aber auch so gut einsetzen. Nach 
außen wirkt eine Property wie eine Variable, der man einen Wert zuweisen 
kann. Bei der Zuweisung kann eine Property aber zusätzlich noch Code 
ausführen, z.B. den Wert auf Gültigkeit prüfen.

Ich will das zum Zugriff auf das EEPROM verwenden. z.B. soll eine 
Property mit dem Namen EM da sein. Bei 'Wert auslesen' wird 
EEPROM[Adresse] ausgeführt, bei 'Wert zuweisen' wird 
EEPROM.update(Adresse, Data) ausgeführt. Das geht auch anders, aber 
Properties sind eleganter.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Du kannst in C genauso objektorientiert programmieren wie in C++, nur 
musst Du Dich um sehr viel selbst kümmern, ohne dabei Unterstützung 
durch den Compiler zu erhalten (es gibt keinen this-Pointer, und kein 
public/private/protected für den Zugriff auf Membervariablen o.ä.).

Als Ersatz für eine Klasse dient hier die simple Struktur; jeder 
"Memberfunktion" musst Du dediziert einen Pointer auf das referenzierte 
Objekt mitgeben, und Konstruktoren/Destruktoren musst Du ebenfalls 
komplett selbst implementieren.

Wenn Du aber Dinge wie Templates, Vererbung oder gar virtuelle 
Funktionen nachbilden wirst, dann wird das ganze schnell sehr, sehr 
umständlich und potentiell fehlerträchtig.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Ich glaube der TO will diverse Operatoren wie [] und = überschreiben. 
Das geht nur in C++, nicht in C.

von Roth (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Du kannst in C genauso objektorientiert programmieren ...

Das will ich doch alles gar nicht :)

Ich wollte nur auf eine Funktion zugreifen können wie auf eine Variable. 
Bei einer Funktion kann man üblicherweise nur einen Wert abfragen, aber 
nicht zuweisen. Einer Property hingegen kann man auch Werte zuweisen. 
Das geht in VBA nicht nur in Klassenmodulen (also Objekte), sondern 
überall. Die Verwendung außerhalb von Klassen ist zwar im allgemeinen 
exotisch, macht aber Sinn und das Programm dadurch wird lesbarer. Also 
why not.

Ich glaube, ich habe verstanden, dass es sowas in C nicht gibt. Kann 
auch so leben oder werde mir was basteln.

Danke für die Infos.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Roth schrieb:
> Ich wollte nur auf eine Funktion zugreifen können
> wie auf eine Variable.

Tja, genau das ist eine der Funktionen von C++.

> Also why not.

C ist nicht VBA. Wenn du schon vergleichst, dann

C++ mit VBA und
C ,mit GW Basic.

von Roth (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> C ist nicht VBA. Wenn du schon vergleichst ...

Habe mit C noch nicht viel gemacht. Das erkennt ihr doch an den Fragen 
;-)

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
-1 lesenswert
nicht lesenswert
Roth schrieb:
> ch wollte nur auf eine Funktion zugreifen können wie auf eine Variable.
> Bei einer Funktion kann man üblicherweise nur einen Wert abfragen, aber
> nicht zuweisen. Einer Property hingegen kann man auch Werte zuweisen.

Aha.

Nun, Du kannst das auch in C erreichen, indem Du statt einer Referenz 
einen Pointer auf das gewünschte Objekt zurückgibst und den beim Aufruf 
Deiner Funktion jeweils dereferenzierst.
1
int *blafusel(void)
2
{
3
  return &bla; 
4
}
5
6
....
7
8
int x;
9
10
x = *blafusel();
11
12
*blafusel() = 14;

von Roth (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Nun, Du kannst das auch in C erreichen, indem Du statt einer Referenz
> einen Pointer auf das gewünschte Objekt zurückgibst und den beim Aufruf
> Deiner Funktion jeweils dereferenzierst.

Besten Dank. Wieder was gelernt :-)

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Es bringt dir nur nichts. Du kannst da z.B. nicht wie gewünscht bei der 
Zuweisung den neuen Wert prüfen, bevor er in die Variable geschrieben 
wird, weil du an den in der Funktion gar nicht rankommst. Du kannst auch 
nicht nach der Zuweisung des neuen Werts irgendwelchen Code ausführen 
(wie z.B. das Schreiben in deinen EEPROM), da die Funktion vor der 
Zuweisung ausgeführt wird. Du kannst in der Funktion auch nicht 
unterscheiden, ob gelesen oder geschrieben werden soll, da diese 
Operation komplett außerhalb der Funktion läuft.

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]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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