Hallo und guten Morgen. ich stelle mir die Frage nach einem sauberen Programmierstil - Richtung C++. Übungsannahme; mehrere zusammengehörige Funktionen SpgUeberwach_Initial() SpgUeberwach_Auslesen() SpgUeberwach_Mittelwert() SpgUeberwach_Auswertung() SpgUeberwach_Zuordnung() die, durch gegenseitige Verschachtelungen, zum Teil auf die gleichen (static) Variablen zugreifen müssen. Zur besseren/einfacheren, würde ich gerne alle zusammengehörigen Variablen in einer Funktion oder einen Block zusammenfassen. Bsp: SpgUeberwach_globalVariablen() Somit hätte ich nicht den "Wust" von unübersichtlichen Übergabeparametern. Geht das? Ist das ein sauberer Programmierstil?
Gast
#4476378
Es fehlen viele Infos was du wirklich bezweckt, aber ich habe das Gefühl das es eine Klasse Spg_Ueberwach geben sollte welche die nötigen Variablen und die genannten Methoden (statisch) vorhält.
Scelumbro schrieb: > Klasse Spg_Ueberwach geben sollte Was ist eine "Klasse" innerhalb der Programmierung? Mit SpgUeberwach_xxx ist eine Gruppe von Funktionen bezeichnet, die alle zusammen eine Spannungsüberwachung an einem oder mehreren Pins auswerten/verarbeiten. Diese Gruppe (alle Funktionen SpgUeberwach_xxx) soll später in unterschiedlichen Programmen als Hintergrund laufen. Damit bei Kopieren/Vererben dieser Hintergrundeigenschaft "Spannungsüberwachung" nichts vergessen wird, habe ich alles mit SpgUeberwach_ bezeichnet. Jetzt geht es als letztes um einige Variablen und Definitionen, die gesammelt in einer Funktion/Modul (Bsp: SpgUeberwach_Parameter()) gesammelt werden.
Es geht um globale Variable. Bilden die einen sauberen Programmierstil, oder eher für den "Notfall"? Kann man die, aus optischen Zugehörigkeits-Gründen, irgend wie in einer Gruppe oder einer Funktion zusammen fassen?
Gast
#4476388
Du möchtest in Richtung C++ und fragst was Klassen sind. Nicht dein ernst. Hast Du einmal den Suchbegriff C++ eingegeben?
Gast
#4476390
Struct?
__Son´s B. schrieb: > Scelumbro schrieb: >> Klasse Spg_Ueberwach geben sollte > Was ist eine "Klasse" innerhalb der Programmierung? Einer der wichtigsten Teile von C++. Und das, was du da beschreibst, klingt exakt nach dem, wofür man in C++ eine Klasse machen würde.
Dieter schrieb: > Du möchtest in Richtung C++ und fragst was Klassen sind. Nicht dein > ernst. Hast Du einmal den Suchbegriff C++ eingegeben? Mir geht es, wie beschrieben, um kleine/modulare Einheiten mit festen Zuordnungen! "Richtung" bedeutet; einige Elemente und Orientierungen. Dazu muss nicht C++ in Gänze beherrscht werden ;-) Weiter Baustellen kann ich mir derzeit nicht leisten!
Rolf M. schrieb: > Einer der wichtigsten Teile von C++. Und das, was du da beschreibst, > klingt exakt nach dem, wofür man in C++ eine Klasse machen würde. Ok! Dann werde ich mich doch mit "Klasse"n beschäftigen.
@ __Son´s Bersi__ (bersison) >"Richtung" bedeutet; einige Elemente und Orientierungen. Dazu muss nicht >C++ in Gänze beherrscht werden ;-) >Weiter Baustellen kann ich mir derzeit nicht leisten! Gute Idee. >Ok! Dann werde ich mich doch mit "Klasse"n beschäftigen. Keine gute Idee! >Es geht um globale Variable. >Bilden die einen sauberen Programmierstil, oder eher für den "Notfall"? Eher Notfall. Nach Möglichkeit nutzt man immer Funktionsparameter. Werden die zu viele, packt man die Daten zusammen in ein Struct und übergibt einen Pointer darauf. Auch das geht ohne globale Variablen. >Kann man die, aus optischen Zugehörigkeits-Gründen, irgend wie in einer >Gruppe oder einer Funktion zusammen fassen? Wie schon erwähnt, mit einem Struct. Lern erstmal ordentlich die Grundlagen in C, dann kannst du über echtes C++ nachdenken. Bis dahin hast du mit C viel zu tun und auch ausreichend Möglichkeiten zur Strukturierte Programmierung auf Mikrocontrollern Siehe auch Strukturen in C Kauf dir ein ordentlichen C-Grundlagenbuch und arbeite das systematisch und komplett durch! Alles andere ist nur Gemurkse.
Gast
#4476408
Tja, da gibt es halt zwei Ansichten. Die einen meinen, so etwas wie die stdio.h war optimal. Nach außen sind nur FILE* und die Funktionen bekannt. Alle internen Variablen bekommt der Anwendungsprogrammierer niemals zu sehen. Andere meinen, was C da bietet sei nicht elegant genug. Es erfordert so viele Tricks, dass wir besser die Klassen aus C++ benutzen. Musst halt beides selbst ausprobieren.
Gast
#4476415
Der 'Trick' den C++ bei den Methoden einer Klasse nutzt ist der (im Aufruf unsichtbare) Zeiger auf sich selber, 'this'. Das kann man wie Falk auch gerade schrieb selber bauen und das wird auch häufig so gemacht. Du packst deine Parameter und Arbeitsvariablen in eine Struktur und jede Funktion bekommt als erstes Argument einen Zeiger auf eine Variable mit dieser Struktur. Auf diese Weise kannst du mehrere 'SpgUeberwach' Instanzen (durch die Variablen mit SPGUEBERWACH_TYPE Struktur) anlegen ohne globale Variablen.
@Jojo S. (jojos) Das habe ich in folgendem Beitrag mal veranschaulicht: Beitrag "Re: This Pointer" @__Son´s Bersi__ (bersison) Du hast soweit ich dass sehe noch garnicht erwähnt, ob du C++ oder eine andere Sprache nutzt. Oder planst du mit C++ anzufangen (richtung c++ ist sehr unspezifisch). Das Problem mit C++ sind die vielen Möglichkeiten etwas umzusetzen, man muss aufpassen es mit den Sprachfeatures nicht zu verlieren.
Gast
#4476430
Was Du suchst ist ein struct. Ein struct ist einfach eine Sammlung von zusammengehörigen Variablen. Den Funktionen, die damit arbeiten sollen, übergibst Du einen Zeiger auf die Struktur.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
In C++ kann man das syntaktisch kürzer hinschreiben, es ergibt aber unterm Blech genau den gleichen Code.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Es ist übrigens üblich, Funktionen so zu benennen, dass sie mit einem Verb anfangen. Funktionen, die nur einen Wert in der Struktur/Klasse lesen/schreiben nennt man Getter/Setter, also beispielsweise SpgUeberwach_SetzeWert statt SpgUeberwach_Zuordnung, wenn die Namen unbedingt Deutsch sein sollen. Aus meiner Sicht ist lesbarer, durchgängig englische Namen zu verwenden, aber das ist ja hier nicht Thema ...
Falk B. schrieb: >>Ok! Dann werde ich mich doch mit "Klasse"n beschäftigen. > > Keine gute Idee! Du meinst, wenn er C++ lernen will, ist es besser, es erstmal so zu machen, wie man es in C++ eigentlich nicht macht, um dann später irgendwann zu lernen, wie's richtig geht. > Lern erstmal ordentlich die Grundlagen in C, dann kannst du über echtes > C++ nachdenken. ok, dann aber bitte bewusst C lernen und nicht ein pseudo-C++.
Ok, dank euch erst einmal für die vielen Anregungen! Jetzt werde ich die Anregungen erst einmal sacken lassen und verarbeiten. Wenn ein sauberer, struktureller, übersichtlicher Programmcode raus kommt, werde ich bei C bleiben - hier befinden sich schon genug Baustellen. _____________________________________________ Vor Jahrzehnten hatte ich mich nach Basic, Fortran77, C, mit C++ beschäftigt und deren OOP-Logik bestechend erachtet. Ist aber alles(!) verschütt gegangen - somit fange ich gerade wieder neu und klein an. _____________________________________________
Die saubere Lösung ist, daß es keine globalen Variablen gibt. Variablen bleiben immer Objekt-lokal (static). Müssen andere Objekte darauf zugreifen, gibt es dafür entsprechende Funktionen. Ob man eine Struct anlegt, hängt davon ab, ob diese Struct mehrfach benötigt wird oder Struct-Pointer verwendet werden sollen.
Gast
#4476474
... und als kleine Ergänzung. Man kommt mit reinem C schon recht weit, wenn für jedes "Objekt" eine *.c Datei und eine *.h Datei anlegt. In der *.h Datei nur möglichst wenige Struct-Pointer und möglichst wenig Funktionen bekannt machen. Bevor du eine Variable in der *.h bekannt machst, 3 mal überlegen, ob es auch anders geht.
Gast
#4476496
__Son´s B. schrieb: > Es geht um globale Variable. > Bilden die einen sauberen Programmierstil, oder eher für den "Notfall"? > Kann man die, aus optischen Zugehörigkeits-Gründen, irgend wie in einer > Gruppe oder einer Funktion zusammen fassen? Da musst du jetzt mal ein Buch über objektorienterte Programmierung lesen. Kurz und knapp: Globale Variablen werden dabei eher vermieden, haben aber immer noch ihre Daseinsberechtigung.
Gast
#4476501
Hans schrieb: > struct SpgUeberwach > { > int wert; > unsigned char nochEineVariable; > } Sehr fleissig das ganze Beispiel zu liefern. Es lohnt sich noch einen Typen SPG_TYPE zu definieren, das reduziert die Schreibarbeit:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Falk B. schrieb: > Kauf dir ein ordentlichen C-Grundlagenbuch und arbeite das systematisch > und komplett durch! Alles andere ist nur Gemurkse. "erstmal C lernen" wenn man C++ programmieren will ist meines Erachtens eine blöde Idee. C++ ist völlig anders als C, der Programmierstil ist völlig unterschiedlich, und Menschen die gut C können schreiben oft sehr merkwürdiges C++.
Ich werde bei C bleiben! Da ich damit angefangen habe und mir entsprechende Fachliteratur und uC-Versuchsanordnungen vor liegen. Durch struct bin ich doch schon da, wo ich hin will.
Amen!
ahhhh - noch eine Frage zum sauberen Code-Stil. Folgend 2 mögliche main()-Module in unterschedlicher Übersichtlichkeit vs. Kompaktheit. ____________________________________________ // --1-- übersichtlicher (finde ich), aber mit 2 zusätzlichen Variablen uint16_t Mittelwert; uint8_t StatusNeu; MittelWert = SpgUeberwach_Mittelwert(100,0); StatusNeu = SpgUeberwach_Auswertung(MittelWert); SpgUeberwach_Ausgang(StatusNeu); ____________________________________________ //--2-- sehr kompakt SpgUeberwach_Ausgang(SpgUeberwach_Auswertung(SpgUeberwach_Mittelwert(100 ,0))); ____________________________________________ Alle weitern Codes sind gleich. Bei der Spannungsüberwachung handelt es sich um einen Teil des gesamten uC-Prog.
Gast
#4481953
V1 ist übersichtlicher, die würde ich bevorzugen. Der Compiler optimiert das sowieso, da braucht man sich keine Gedanken über zuviel Resourcenverschwendung zu machen. Und es ist leichter zu debuggen wenn Zwischenergebnisse in Variablen auftauchen.
DANKE!
Gast
#4483002
V1. Lesbarkeit/Maintainability/Robustness sind wichtiger, als Sourcezeilen oder ein bissel Laufzeit zu sparen. Die Zeiten, in denen man in Assembler aufs letzte Byte optimieren mmusste sind vorbei. Und nochmal zu der Ursprungsfrage: Globale Variablen braucht man nicht. Nie. Und wenn doch läuft etwas schief.
EFA schrieb: > Und nochmal zu der Ursprungsfrage: Globale Variablen braucht man nicht. > Nie. Und wenn doch läuft etwas schief. Ja, ist an gekommen. Trotzdem wird es einen kompakten Bereich geben in dem ich einmalig alle Grundparameter ablege. Habe es gerade mit Präproz-Makros gelöst. Mit struct() bin ich aus Zeitmangel noch nicht weiter gekommen.
@ EFA (Gast) >Lesbarkeit/Maintainability/Robustness sind wichtiger, als Sourcezeilen >oder ein bissel Laufzeit zu sparen. Die Zeiten, in denen man in >Assembler aufs letzte Byte optimieren mmusste sind vorbei. Stimmt. >Und nochmal zu der Ursprungsfrage: Globale Variablen braucht man nicht. >Nie. Und wenn doch läuft etwas schief. Ist mir zu dogmatisch. Theoretisch mag das funktionieren, PRAKTISCH sind globale Variablen MINDESTENS für ISR-Main Kommunikation nötig, da geht es gar nicht anders. Ausserdem kann man bei KLEINEN Programmen mit SINNVOLLEN globalen Variablen die Übergabe von zuviel Parametern zwischen Funktionen sparen. Wenn es um das Thema Multitasking in seinen verschiedenen Ausprägungen geht, sind globale Variablen auch sehr nützlich. Man darf es nur nicht übertreiben, weder in die eine noch ander Richtung!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.