Hallo,
ich muss ja zugeben, ein begnadeter Programmierer bin ich nicht, aber
durchaus gewillt, mich weiter fort zu bilden.
Daher lese ich immer wieder mal das eine oder andere C Buch.
Nur was mir wirklich nicht in den Kopf will, warum wird so gegen globale
Variablen gewettert?
Das Argument, dass von außen fremde Funktionen auf diese einwirken
könnten und so zu Schäden oder ungewünschten Veränderungen führen ist
doch irgendwie konstruiert, denn letztenendes sind doch auch globale
Variablen nur durch Funktionen aus eben jenem abgeschlossenen Programm
zugänglich...
Der Verzicht auf globale Variablen wird dann durch Einführen von
diverser Pointerarithmetik umgangen, mit der Folge, dass nun eben der
Pointer auf fremde Speicherbereiche zugreifen kann und dies meiner
Ansicht nach zu weniger Transparenz führt...
Mikro 7. schrieb:> stackoverflow
Globale Variablen sind (zumindest auf uC) DIE Strategie gegen
"stackoverflow" :-) und hardfault
Zudem sind keine der genannten Argumente stichhaltig, es gibt nämlich
sowas wie "modulares und strukturiertes" Programmieren auch in C ganz
ohne OOP. Am einfachsten, indem man den Funktionen und globalen
Variablen eines Moduls den Modulnamen voranstellt.
Globalus schrieb:> Das Argument, dass von außen fremde Funktionen auf diese einwirken> könnten und so zu Schäden oder ungewünschten Veränderungen führen ist> doch irgendwie konstruiert, denn letztenendes sind doch auch globale> Variablen nur durch Funktionen aus eben jenem abgeschlossenen Programm> zugänglich...
Aus einem Programm, das möglicherweise aus Millionen von Lines of Code
und mehreren 10000 globalen Variablen besteht. Viel Spass beim debuggen,
wenn mal eine Variable mit dem falschen beschrieben wurde. Resultat:
Chaos
Bibliotheken könnte man auch keine schreiben. Jede Bibliothek müsste
ihre eigenen globalen Variablen mitbringen, die dann im Speicher
vergammeln. Doppelte Namen müsste man auch verhindern. Resultat: Chaos
Globalus schrieb:> Der Verzicht auf globale Variablen wird dann durch Einführen von> diverser Pointerarithmetik umgangen, mit der Folge, dass nun eben der> Pointer auf fremde Speicherbereiche zugreifen kann und dies meiner> Ansicht nach zu weniger Transparenz führt...
Wenn man nicht auf fremde Speicherbereiche zugreifen will, macht mans
halt global? Man muss so oder so zugreifen, ob global oder nicht.
Resultat: Chaos
Transparenz? Siehe meinen ersten Einwand.
Globalus schrieb:> Das Argument, dass von außen fremde Funktionen auf diese einwirken> könnten und so zu Schäden oder ungewünschten Veränderungen führen ist> doch irgendwie konstruiert, denn letztenendes sind doch auch globale> Variablen nur durch Funktionen aus eben jenem abgeschlossenen Programm> zugänglich...
Globale Variablen sind von überall und immer zugänglich.
> Der Verzicht auf globale Variablen wird dann durch Einführen von> diverser Pointerarithmetik umgangen, mit der Folge, dass nun eben der> Pointer auf fremde Speicherbereiche zugreifen kann und dies meiner> Ansicht nach zu weniger Transparenz führt...
Nee, das passt nicht.
Du hast eine Variable, die du schreiben möchtest. Der direkte Zugriff
könnte jetzt Ärger machen, wenn von dem neu geschriebenen Wert noch
andere Variablen abhängen. Also definiert man die Variable 'static' in
einem Modul und läßt das Beschreiben nur über eine Funktion zu, welche
sich dann gleichzeitig um die - nach außen hin unsichtbaren -
Abhängigkeiten kümmert. Das muss am Anfang der Entwicklung noch gar
nicht alles feststehen. (Wie man das jetzt 'sortiert' und in Module
packt, allerdings schon.) Falls dann die Funktion nur die Variable
beschreibt - macht nichts. Wenn jetzt aber eine Abhängigkeit dazukommt,
würdest du deinen ganzen Quelltext durchsuchen und eine Zusatzfunktion
oder -zuweisung einbauen. Aber nichts vergessen!, und immer schön alles
ändern! ;-)
(Beispiel, irgendein PC-Programm: Es nützt überhaupt nichts eine
Variable 'window_width' mit 1000 zu beschreiben, es wäre nicht schlecht,
wenn das Fenster dann mit dieser Breite, die Scrollbalken,
Schaltflächen, evtl. Textumbrüche auch neu gezeichnet werden.)
Es gibt zwei Aspekte, wie eine variable "global" sein kann: Sichtbarkeit
und Lebensdauer.
Eine Variable mit globaler Sichtbarkeit hat immer auch globale
Lebensdauer.
Beide Aspekte tragen zum schlechten Ruf bei. Aus vielen Gründen, die
folgenden sind nicht alles.
Sichtbarkeit: Funktionen, die auf global sichtbare Variablen zugreifen,
sieht man das an ihrer Deklaration nicht an. Man muss den Code lesen.
Lebensdauer: Variablen mit globaler Lebensdauer führen dazu, dass das
Programm viele "Zustände" hat. Funktionen, die darauf zugreifen,
reagieren nicht immer gleich, auch wenn alle Parameter gleich sind. Das
kann verwirrend sein.
Lebensdauer: Es ist gefährlich, Funktionen, die auf Variablen mit
globaler Lebensdauer zugreifen, aus mehreren Threads (bzw. ISRs, ...)
aufzurufen.
Es gibt sie genau einmal pro Prozess...
... aber oft merkt man später, dass man doch nicht nur eine davon
braucht
... oder umgekehrt, bei Sachen die es wirklich nur einmal im
Universum/auf dem PC gibt, ist "einmal pro Prozess" zuviel.
C++, Zeitpunkt zu dem Konstruktoren laufen... schlimme Sache. Noch
schlimmer wenn DLLs in Spiel kommen.
Sebastian schrieb:> Eine Variable mit globaler Sichtbarkeit hat immer auch globale> Lebensdauer
Daher ist der Speicherbedarf beim Linken fix und bekannt. Lokale
Variablen führen zu nicht-deterministischem Verhalten, insbesondere bei
rekursiven Funktionen.
Sebastian schrieb:> Lebensdauer: Es ist gefährlich, Funktionen, die auf Variablen mit> globaler Lebensdauer zugreifen, aus mehreren Threads (bzw. ISRs, ...)> aufzurufen
Eine globale Variable ist eine einmal vorhandene Ressource und wird
genau so behandelt wie z.B. Register, also MUTEX u.ä. ISR mit lokalen
Variablen sind hingegen wirklich gefährlich, auf einem Cortex-R mit
Registerbänken kann dann noch der Stack gerettet werden, auf Cortex-M
ist Ende im Hardfault.
Hallo Globus.
Globalus schrieb:> Nur was mir wirklich nicht in den Kopf will, warum wird so gegen globale> Variablen gewettert?> Das Argument, dass von außen fremde Funktionen auf diese einwirken> könnten und so zu Schäden oder ungewünschten Veränderungen führen ist> doch irgendwie konstruiert, denn letztenendes sind doch auch globale> Variablen nur durch Funktionen aus eben jenem abgeschlossenen Programm> zugänglich...
Schon, aber es wird dann sehr schnell unübersichtlich, wenn das Programm
größer wird.
> Der Verzicht auf globale Variablen wird dann durch Einführen von> diverser Pointerarithmetik umgangen, mit der Folge, dass nun eben der> Pointer auf fremde Speicherbereiche zugreifen kann und dies meiner> Ansicht nach zu weniger Transparenz führt...
Weil das ja auch nicht der offizielle Weg der OO Programmierung ist.
Der ist, beim Unterprogrammaufruf die betreffenden Variablen zu
übergeben.
Es gibt nach meiner Ansicht aber seltene Ausnahmen:
Wenn Du ein Objekt direkt global anlegst, und alle Funktionen arbeiten
daran herum, wie viele Bauarbeiter an einem großen Gebäude.
Aber auch das dürfte nur für kleinere bis mittlere Programme sinnvoll
sein.
Mit freundlichem Gruß: Bernd Wiebus alias dl1eic
http://www.l02.de