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...
Globalus schrieb: > warum wird so gegen globale Variablen gewettert? Man weiß doch, wo die Globalisierung hinführt.
:
Bearbeitet durch User
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.