Forum: Mikrocontroller und Digitale Elektronik Arduino C++: Probleme mit Reihenfolge von Funktionen


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Funktionen schreibt man ja, um Code mehrfach zu verwenden. Bei größeren 
Projekten gibts da immer wieder Probleme mit deren Reihenfolge wenn man 
in eigenen Funktionen andere eigene Funktionen aufruft. D.h. man kann 
eine Funktion nicht verwenden, bevor diese deklariert ist - was ja auch 
irgendwie logisch klingt.

In der Praxis ist das aber immer wieder Anlass für Stress, die Functions 
in ihrer Reihenfolge im Code umzusortieren.

Im "guten alten" Turbopascal, gab es dafür die Option "forward", um 
genau diesem Problem aus dem Wege zu gehen. Gibt es etwas Vergleichbares 
in C++?

von Tom (Gast)


Lesenswert?


von C.K. (Gast)


Lesenswert?


von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Frank E. schrieb:
> D.h. man kann
> eine Funktion nicht verwenden, bevor diese deklariert ist - was ja auch
> irgendwie logisch klingt.

Deklaration einer Funktion in C++:
1
void func(int a, int b);

Definition einer Funktion in C++:
1
void func(int a, int b) {
2
...
3
}

> In der Praxis ist das aber immer wieder Anlass für Stress, die Functions
> in ihrer Reihenfolge im Code umzusortieren.

Kenne keine Sprache, in der das je ein Problem ist oder war.

von EAF (Gast)


Lesenswert?

Frank E. schrieb:
> C++

Die Verweise auf eine C Doku sind schon (fast) ok
Beachten könnte man, dass sich C++ da etwas anders, als C, verhält.
https://en.cppreference.com/w/cpp/language/function

von NichtWichtig (Gast)


Lesenswert?

Für C++ gilt ähnliches ;)

https://cplusplus.com/doc/tutorial/functions/

von Wilhelm M. (wimalopaan)


Lesenswert?

Frank E. schrieb:
> Funktionen schreibt man ja, um Code mehrfach zu verwenden.

Nein: Funktionen schreibt man, um Code zu strukturieren (und damit 
leichter verständlich zu machen) und zu abstrahieren (bspw. UDT in C++).

Beispiel: Interation zur Berechnung der Potenzreihe für sinus(x).
Die Bedeutung von
1
auto a = sin(x);
2
// weiter mit a
ist einfacher zu erfassen als (Details ausgelassen):
1
float a = x;
2
uint64_t f = 1;
3
for(...) {
4
   f *= (2 * i + 1);
5
   float g = x / f;
6
   g *= ...;
7
   a += g;
8
}
9
// weiter mit a

Ein schöner Nebeneffekt ist selbstverständlich die Wiederverwendbarkeit.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Frank E. schrieb:
> Funktionen schreibt man ja, um Code mehrfach zu verwenden.

Eher, um auf Herz und Nieren geprüfte Grundbausteine für die 
Programmierung zur Verfügung zu haben und nicht jedes Mal das Rad neu 
erfinden zu müssen. Und natürlich, um die Komplexität der Testszenarien 
niedrig zu halten.

von Alexander (alecxs)


Lesenswert?

Funktionen schreibt man nicht, man sucht sich die passenden Header files 
im Arduino Forum ;)

von EAF (Gast)


Lesenswert?

Alexander schrieb:
> man sucht sich die passenden Header files
> im Arduino Forum

Kann man tun....

von Manfred (Gast)


Lesenswert?

Wolfgang schrieb:
>> Funktionen schreibt man ja, um Code mehrfach zu verwenden.
> Eher, um auf Herz und Nieren geprüfte Grundbausteine für die
> Programmierung zur Verfügung zu haben und nicht jedes Mal das Rad neu
> erfinden zu müssen.

Man greift gerne auf fertige Funktionen zu, z.B. für das Display oder 
die Abfrage externer A/D-Wandler.

Was Deine "auf Herz und Nieren geprüfte Grundbausteine" angeht, na ja - 
wenn da etwas faul ist, hat man es gleich in allen Anwendungen.

Ein "Arduino" wird dann als Copy & Paste-Bastler beschimpft, während das 
in anderen Umgebungen wie Java gang und gäbe ist. Dazu passend direkt 
ein Kommentar:

Alexander schrieb:
> Funktionen schreibt man nicht, man sucht sich die passenden Header files
> im Arduino Forum ;)

Nicht zu vergessen: Wenn man Dinge mehrfach benötigt, z.B. Blitzen einer 
LED oder einen TastenPiep, kann man damit Platz im Programmspeicher 
sparen.

von EAF (Gast)


Lesenswert?

Manfred schrieb:
> Ein "Arduino" wird dann als Copy & Paste-Bastler beschimpft, während das
> in anderen Umgebungen wie Java gang und gäbe ist.

Ach, lass mal gut sein...
Arduino User schämen sich nicht wirklich, wenn sie fremden Code 
übernehmen und weiter verwenden. Gehört es doch geradezu, mit den 
Libraries, zum Konzept so zu handeln.
Die C&P Vorhaltung ist also etwas absurd.

von Alexander (alecxs)


Lesenswert?

EAF schrieb:
> Die C&P Vorhaltung ist also etwas absurd.

besonders unter der MIT-Lizenz

von bin ganz bei dir (Gast)


Lesenswert?

EAF schrieb:
> Manfred schrieb:
>> Ein "Arduino" wird dann als Copy & Paste-Bastler beschimpft, während das
>> in anderen Umgebungen wie Java gang und gäbe ist.
>
> Ach, lass mal gut sein...
> Arduino User schämen sich nicht wirklich, wenn sie fremden Code
> übernehmen und weiter verwenden. Gehört es doch geradezu, mit den
> Libraries, zum Konzept so zu handeln.
> Die C&P Vorhaltung ist also etwas absurd.

C/C++ Standard Library Users schämen sich nicht wirklich, wenn sie 
fremden Code übernehmen und weiter verwenden.

Das einzige was fehlt um die Welt wieder ins Lot zu ruecken, ist eine 
eigene ISO/IEC-WorkingGroup fuer das "Arduino-Gedöns". Dann Budda bei de 
Fische, neh?

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Habe das mit den Prototypen jetz mal ausprobiert, funzt.

Ist das wirlklich immer so einfach, oder gibts da noch irgendwelche 
Fettnäpfe bzw. Tretminen auf die man achten sollte?

von EAF (Gast)


Lesenswert?

Frank E. schrieb:
> Ist das wirlklich immer so einfach, oder gibts da noch irgendwelche
> Fettnäpfe bzw. Tretminen auf die man achten sollte?

Ja, nein!

Bis auf:
Mit C++ brauchts eigentlich kaum noch Funktionen.
Da spielt die Musik in Namensräumen, und dort eher mit Methoden und 
Operatoren

von Jens R. (tmaniac)


Lesenswert?

EAF schrieb:
> Frank E. schrieb:
>> Ist das wirlklich immer so einfach, oder gibts da noch irgendwelche
>> Fettnäpfe bzw. Tretminen auf die man achten sollte?
>
> Ja, nein!
>
> Bis auf:
> Mit C++ brauchts eigentlich kaum noch Funktionen.
> Da spielt die Musik in Namensräumen, und dort eher mit Methoden und
> Operatoren

Hmmm, wo ist der Unterschied zwischen Methoden und Funktionen? 🤔

von EAF (Gast)


Lesenswert?

Jens R. schrieb:
> wo ist der Unterschied zwischen Methoden und Funktionen? 🤔

Methoden hängen nicht einfach so im kontextfreien Raum rum, sondern sind 
an/in einer Struktur/Klasse gebunden.
Sie bekommen einen versteckten this Parameter übergeben.

von Jens R. (tmaniac)


Lesenswert?

EAF schrieb:
> Jens R. schrieb:
>> wo ist der Unterschied zwischen Methoden und Funktionen? 🤔
>
> Methoden hängen nicht einfach so im kontextfreien Raum rum, sondern sind
> an/in einer Struktur/Klasse gebunden.

Der war genial.
Funktionen heißen Funktion, weil sie eine Funktion ausführen.
Auch in C sollten Funktionen nicht im "kontextfreien Raum" herum hängen. 
Weil eine Funktion eine bestimmte Aufgabe erfüllen sollte.
Den Begriff Methoden nutzt man in der objektorientierten Programmierung 
weil da die "Funktion" eines Objektes eben dessen methodische Arbeiten 
darstellt. Aber vom Aufbau ist auch eine Methode immer eine Funktion. 
Mit dem organisatorischen Pluspunkt, dass diese Funktion eben einem 
festen Objekt zu geordnet ist. Diese Zuordnung wird der Kontext sein, 
den du meinst.

> Sie bekommen einen versteckten this Parameter übergeben.
Ersten ist "this" kein Parameter und erst recht nicht versteckt 🤷‍♂️
Ja man kann mit this auf das aufrufende Objekt verweisen und es als 
Pointer einem Parameter einer Methode übergeben. Man kann das aber auch 
jeder anderen Funktion (also ohne Zuordnung zu einem Objekt) übergeben.

Aber zurück zu
> Habe das mit den Prototypen jetz mal ausprobiert, funzt.
Auch für die Methoden einer Klasse nutzt man Prototypen.
Das Erste was man in C und C++ lernt sind eben Deklaration und 
Definition. Da gibt es keine Unterschiede.

von EAF (Gast)


Lesenswert?

Jens R. schrieb:
> Diese Zuordnung wird der Kontext sein,
> den du meinst.
Du bist ja eine richtige Blitzbirne!

von Wilhelm M. (wimalopaan)


Lesenswert?

EAF schrieb:
> Frank E. schrieb:
>> Ist das wirlklich immer so einfach, oder gibts da noch irgendwelche
>> Fettnäpfe bzw. Tretminen auf die man achten sollte?
>
> Ja, nein!
>
> Bis auf:
> Mit C++ brauchts eigentlich kaum noch Funktionen.

Steile These!

In C++ spricht man nicht von Methoden, sondern von Elementfunktionen. 
Und im Gegensatz dazu von freien Funktionen.

von Wilhelm M. (wimalopaan)


Lesenswert?

Jens R. schrieb:
> EAF schrieb:
>> Frank E. schrieb:
>>> Ist das wirlklich immer so einfach, oder gibts da noch irgendwelche
>>> Fettnäpfe bzw. Tretminen auf die man achten sollte?
>>
>> Ja, nein!
>>
>> Bis auf:
>> Mit C++ brauchts eigentlich kaum noch Funktionen.
>> Da spielt die Musik in Namensräumen, und dort eher mit Methoden und
>> Operatoren
>
> Hmmm, wo ist der Unterschied zwischen Methoden und Funktionen? 🤔

Es gibt keinen, nur nennt man Funktionen als Elemente von Klassen eben 
Element-Funktion in C++.

von Wilhelm M. (wimalopaan)


Lesenswert?

Jens R. schrieb:
>> Sie bekommen einen versteckten this Parameter übergeben.
> Ersten ist "this" kein Parameter und erst recht nicht versteckt 🤷‍♂️

Bei non-statics unter der Haube schon.

von Wilhelm M. (wimalopaan)


Lesenswert?

Jens R. schrieb:
>> Habe das mit den Prototypen jetz mal ausprobiert, funzt.
> Auch für die Methoden einer Klasse nutzt man Prototypen.
> Das Erste was man in C und C++ lernt sind eben Deklaration und
> Definition. Da gibt es keine Unterschiede.

Keine Unterschiede zwischen Deklaration und Definition? Ich glaube, hier 
wäre eine C/C++-Buch angebracht.

von Jester (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Jens R. schrieb:
>>> Habe das mit den Prototypen jetz mal ausprobiert, funzt.
>> Auch für die Methoden einer Klasse nutzt man Prototypen.
>> Das Erste was man in C und C++ lernt sind eben Deklaration und
>> Definition. Da gibt es keine Unterschiede.
>
> Keine Unterschiede zwischen Deklaration und Definition? Ich glaube, hier
> wäre eine C/C++-Buch angebracht.

Ich habe den Jens anders verstanden: "Was Deklaration und Definition 
angeht -- da gibt es keine Unterschiede zwischen C und C++".

just my 2 ct

von Wilhelm M. (wimalopaan)


Lesenswert?

Jester schrieb:
> Ich habe den Jens anders verstanden: "Was Deklaration und Definition
> angeht -- da gibt es keine Unterschiede zwischen C und C++".

Ok, danke für die Klarstellung.

von Veit D. (devil-elec)


Lesenswert?

>> Hmmm, wo ist der Unterschied zwischen Methoden und Funktionen? 🤔
>
> Es gibt keinen, nur nennt man Funktionen als Elemente von Klassen eben
> Element-Funktion in C++.

Hallo Wilhelm,

ich dachte immer du bist für knallharte Klarheit. Diese Antwort aus 
deinem Munde zu hören ist nun doch schon mehr als fragwürdig. Du reitest 
ansonsten auf den Begriffen rum wie kein anderer, auch hier bei Methoden 
vs. Elementfunktionen, willst aber im gleichem Atemzug keinen 
Unterschied zwischen Elementfunktionen und Funktionen kennen. Also ich 
bitte dich. Den Unterschied hat EAF in 2 Sätzen bezüglich Bindung auf 
den Punkt gebracht. Andere müssen dafür einen Roman schreiben, weil sie 
2 einfache Sätze nicht verstanden haben. Ich meine wenn es keinen 
tieferen Unterschied geben würde, dann würden sie wohl kaum 
unterschiedlich benannt werden bzw. gebe es keine begriffliche Trennung 
auf die du sonst so viel wert legst. Bin ein klein wenig enttäuscht über 
deine Aussage.

Nichts für Ungut ...

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Veit D. schrieb:
>>> Hmmm, wo ist der Unterschied zwischen Methoden und Funktionen? 🤔
>>
>> Es gibt keinen, nur nennt man Funktionen als Elemente von Klassen eben
>> Element-Funktion in C++.
>
> Hallo Wilhelm,
>
> ich dachte immer du bist für knallharte Klarheit. Diese Antwort aus
> deinem Munde zu hören ist nun doch schon mehr als fragwürdig. Du reitest
> ansonsten auf den Begriffen rum wie kein anderer, auch hier bei Methoden
> vs. Elementfunktionen, willst aber im gleichem Atemzug keinen
> Unterschied zwischen Elementfunktionen und Funktionen kennen.

Gut, Du hast mich der Sünde der kurzen Rede überführt ;-)

Ich hatte

>>> Hmmm, wo ist der Unterschied zwischen Methoden und Funktionen?

den Satz so verstanden, dass hier der Begriff Funktion eben als 
Elementfunktion zu lesen ist, wie man das eben manchmal so macht: die 
Funktion bla() in X (gemeint ist die Elementfunktion der Klasse X).

Und den von Dir angesprochenen Unterschied hatte ich im Beitrag davor 
genannt.

Wilhelm M. schrieb:
> In C++ spricht man nicht von Methoden, sondern von Elementfunktionen.
> Und im Gegensatz dazu von freien Funktionen.

Insofern denke ich, dass das jetzt klar ist.

Der Begriff Methode ist eben ein grundlegender Begriff aus der OOP. In 
Java hat man den dann auch so übernommen, in C++ eben nicht, weil C++ 
mehr als nur das OOP-Paradigma kann.

Nun, jetzt könnte ich natürlich auch sagen, dass das folgende falsch 
ist:

EAF schrieb:
> Methoden hängen nicht einfach so im kontextfreien Raum rum, sondern sind
> an/in einer Struktur/Klasse gebunden.
> Sie bekommen einen versteckten this Parameter übergeben.

Nicht jede Elementfunktion bekommt den Zeiger auf das Objekt: nur 
non-static Elementfunktionen, was man im Java-Speech dann 
Klassenmethoden nennt.

Und dies ist dann ebenso fragwürdig:

EAF schrieb:
> Bis auf:
> Mit C++ brauchts eigentlich kaum noch Funktionen.
> Da spielt die Musik in Namensräumen, und dort eher mit Methoden und
> Operatoren

von Veit D. (devil-elec)


Lesenswert?

Hallo,

genauso kenne ich dich. Das wollte ich hören.  :-)

Also mal wieder das übliche Problem mit Zitieren & Antworten, der eine 
versteht es so der andere wiederum anders und schon hat man 
Kuttelmuttel. Sprich Forumsalltag.

Ich wußte tief im Inneren das du Elementfunktion und Funktion trennen 
kannst.

Wünsche dir und allen schönes Wochenende. Ende gut alles gut.

von Wilhelm M. (wimalopaan)


Lesenswert?

Veit D. schrieb:

> Ich wußte tief im Inneren das du Elementfunktion und Funktion trennen
> kannst.

Danke für das Vertrauen ;-)

> Wünsche dir und allen schönes Wochenende. Ende gut alles gut.

dito

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.