Forum: Compiler & IDEs Objekte in C?


von Gast (Gast)


Lesenswert?

Hi,

bei Arduino Sketches gibt es Funktionsaufrufe wie
Wire.begin(), Serial.begin(), Wire.recive(), ..

Ich dachte C ist nicht objektorientiert? nanu?

Danke ;)

von Stefan E. (sternst)


Lesenswert?

Dann sind Wire.begin, Serial.begin und Wire.recive wahrscheinlich 
einfach nur Funktionspointer.

von Michael W. (retikulum)


Lesenswert?

Das sind Funktionsaufrufe und keine Objekte.

Michael

von gast (Gast)


Lesenswert?

man kann sich solche sachen prima selbst schnell zusammenbasteln
habe es mal versucht

bei wenigen funktionen is das brauchbar ...
ab einer gewissen menge an funktionen bläht es aber ganz schön


zB

12k flash ohne dieses struct
12,8k flash mit dieser stuct umd zB uart.print( xxxx) zu schreiben
je größer das projekt desto größer der speicherbedarf

von Col. Trautman (Gast)


Lesenswert?

> Ich dachte C ist nicht objektorientiert?
OOP fängt im Kopf an, nicht in der Programmiersprache, prinzipiell sind 
Strukturen in C Klassen, da ist halt alles public. Im Linux-Kernel [1] 
arbeitet man so, die Methoden sind dann Funktionszeiger.
Ob OOP so toll ist, dass man sowas machen muss, bleibt im Auge des 
Betrachters.

[1] https://ezs.kr.hsnr.de//TreiberBuch/html//sec.technik.html

von Gast (Gast)


Lesenswert?

ok, vielen dank.

und wie setz ich soetwas selbst um?

von Karl H. (kbuchegg)


Lesenswert?

Gast schrieb:
> ok, vielen dank.
>
> und wie setz ich soetwas selbst um?

Indem du in deinem schlauen C-Buch erst mal das Kapitel über 
Funktionspointer wieder und wieder studierst.

Danach überlegst du dir, was wohl passieren würde, wenn du einer 
Struktur neben den eigentlichen Datenfeldern ein paar Funktionszeiger 
verpasst und wie man die benutzen könnte. Und wenn du soweit bist, 
kannst du anfangen kreativ zu werden :-)

von lex (Gast)


Lesenswert?

1
struct {
2
    void bar = foo_bar;
3
} foo;
4
5
void foo_bar () {
6
7
}
8
9
void main () {
10
    foo.bar();
11
}

nur bin ich mir innerhalb von struct bei void nicht sicher.. welchen typ 
muss ich denn für eine funktion angeben?

von Karl H. (kbuchegg)


Lesenswert?

lex schrieb:

> nur bin ich mir innerhalb von struct bei void nicht sicher.. welchen typ
> muss ich denn für eine funktion angeben?

http://www.mikrocontroller.net/articles/FAQ#Funktionszeiger

von Gast (Gast)


Lesenswert?

Hi,

danke für die vielen Antworten..
Dann müsste es ja folgendes tun:
1
typedef void (*voidFn)( void );
2
3
struct {
4
    voidFn bar = foo_bar;
5
} foo;
6
7
void foo_bar () {
8
9
}
10
11
void main () {
12
    foo.bar();
13
}

Klar, über den Sinn kann man streiten, aber ich finde es macht das ganze 
übersichtlicher und ich persönlich find i2c.send() einfach schöner wie 
i2c_send().. könnt auch daran liegen, dass sich ein . minimal einfacher 
tippt wie _ ;)

von gast (Gast)


Lesenswert?

häufige verwendung bläht wie gesagt da überall im ram und flash mit 
16bit pointern rumgeworfen wird
übersichtlich ist es auf jeden ...

von Gast (Gast)


Lesenswert?

für die kleineren Projekte wirds reichen ;)
bei den größeren ist dann halt die Frage ob man lieber einen µC größer 
nimmt, um die bei größeren Projekten besonders wichtige Übersicht zu 
gewährleisten..

ich hab derweil übrigens im source vom arduino gesucht und bin auf die 
libraries gestoßen.. die sind in c++ geschrieben..

und auf der offiziellen seite ist auch ein tutorial, wie man selber 
libraries schreibt ;)

von chris (Gast)


Lesenswert?

Der Beitrag hat den selben Titel wie dieser Thread:

Beitrag "Objekte in C"

Hier wird beschrieben, wie man "quasi" Objekte in C erzeugen kann.

von chris (Gast)


Lesenswert?

>bei Arduino Sketches gibt es Funktionsaufrufe wie
>Wire.begin(), Serial.begin(), Wire.recive(), ..
>Ich dachte C ist nicht objektorientiert? nanu?
Die Arduino Bibliotheken sind in C++ geschrieben. Deshalb ist die 
Objektorientiertheit kein Problem.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.