Alle Variablen auf einmal "globalisieren"
Alle Variablen auf einmal "globalisieren"
Ich habe hier einen Programmcode mit ziemlich vielen Vairablen. Diese möchte ich jetzt fast alle in eine Prozedur einbauen. Nun müsste ich vor alle Variablen shared, oder global setzen. Gibt es eine Möglichkeit dem Compiler zu sagen, das einfach alle Variablen überall benutzt werden können?
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
du bist auf dem falschen Weg, konzipiere komplett um.
das, was du jetzt an arbeit vermeidest, kommt später tausendfach auf dich zu.
nichts ist tödlicher, als ein projekt, wo alle verdammten variablen global sind.
stop hier, denk um, oder es wird weh tun.
...ein wohlgemeinter rat aus eigener erfahrung.... (wir alle waren mal rookies)
das, was du jetzt an arbeit vermeidest, kommt später tausendfach auf dich zu.
nichts ist tödlicher, als ein projekt, wo alle verdammten variablen global sind.
stop hier, denk um, oder es wird weh tun.
...ein wohlgemeinter rat aus eigener erfahrung.... (wir alle waren mal rookies)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Am besten du erstellst einen Kontext für deine Applikation.
Also am Anfang des Codes eine Struktur, welche alle nötigen Variablen enthält:
Beim initialisieren der Applikation kannst du diese Struktur im Speicher erstellen und später all deinen Prozeduren diesen Kontext und dessen Inhalt via Parameter verpassen.
Vorteil: Du hast einen Pointer der alles eingekapselt enthält auf dessen Inhalt du in allen Bereichen zugreifen kannst solange die Adresse des Kontextes übergeben wird.
Und wenn du z.B. sodann deine Applikation re-initialisieren willst, musst du nicht wie bei Globalen alle einzeln auf 0 oder den defuault Wert setzen, sondern kannst das mit der Struktur an der Adresse blitzschnell lösen:
PS: Normale Variablen sind lokal, bedeutet auf sie kann lediglich im aktuellen Gültigkeitsbereich zugegriffen werden.
... wird 10 rauskommen, da die Procedure Function einen eigenen Gültigkeitsbereich hat.
http://www.purearea.net/pb/german/index.htm und dort unter "Prozeduren Unterstützung" die Links ansehen.
Wenn du also mit einer Melanie aus Hausnummmer 54 (die Prozedur) welche Hausarrest (local) hat rum fummelst, bedeutet es eben noch nicht, dass alle Melanies in allen anderen Häusern der Strasse etwas mit dir erlebt haben nur weil sie Melanie heissen. Die Häuser sind also die Gültigkeitsbereiche.
Wenn aber nun eine Melanie die globale Melanie der Strasse ohne Konkurrenz ist und keinen Hausarrest (global) hat und du mit ihr rum fummelst, dann kann sie in alle anderen Häuser (Prozeduren) zum Kaffeeklatsch gebeten werden und erzählen wie du an ihr rum gefummelt hast.
Also am Anfang des Codes eine Struktur, welche alle nötigen Variablen enthält:
Code: Alles auswählen
Structure APPLICATIONCONTEXT
hwnd.l
xyz.b
ping.l
dingsDa.b
*pAdresse
...
... usw
..
.
EndStructure
Procedure InitApp(*ctx.APPLICATIONCONTEXT, var1.l, var2.b, *pointer)
*ctx\ping = var1
*ctx\dingsDa = var2
*ctx\pAdresse = *pointer
EndProcedure
Beim initialisieren der Applikation kannst du diese Struktur im Speicher erstellen und später all deinen Prozeduren diesen Kontext und dessen Inhalt via Parameter verpassen.
Code: Alles auswählen
*ctx.APPLICATIONCONTEXT = AllocateMemory(SizeOf(APPLICATIONCONTEXT))
InitApp(*ctx, 10, 20, 60)
Und wenn du z.B. sodann deine Applikation re-initialisieren willst, musst du nicht wie bei Globalen alle einzeln auf 0 oder den defuault Wert setzen, sondern kannst das mit der Struktur an der Adresse blitzschnell lösen:
Code: Alles auswählen
CopyMemory(*AdressOfDefaultsStorage, *ctx)
oder alles wieder auf Zero zurück:
For i = 0 to SizeOf(APPLICATIONCONTEXT)-1
PokeB(*ctx, 0)
Next i
PS: Normale Variablen sind lokal, bedeutet auf sie kann lediglich im aktuellen Gültigkeitsbereich zugegriffen werden.
Code: Alles auswählen
local.l = 10
Procedure Function(....)
local = 20
EndProcedure
debug local
http://www.purearea.net/pb/german/index.htm und dort unter "Prozeduren Unterstützung" die Links ansehen.
Wenn du also mit einer Melanie aus Hausnummmer 54 (die Prozedur) welche Hausarrest (local) hat rum fummelst, bedeutet es eben noch nicht, dass alle Melanies in allen anderen Häusern der Strasse etwas mit dir erlebt haben nur weil sie Melanie heissen. Die Häuser sind also die Gültigkeitsbereiche.
Wenn aber nun eine Melanie die globale Melanie der Strasse ohne Konkurrenz ist und keinen Hausarrest (global) hat und du mit ihr rum fummelst, dann kann sie in alle anderen Häuser (Prozeduren) zum Kaffeeklatsch gebeten werden und erzählen wie du an ihr rum gefummelt hast.
Hier gibts die OOP Option für PureBasic.
Ein anderes gutes Beispiel: Stell Dir einfach vor, in einer 500-Mann-Firma hat jeder Mitarbeiter Zugriff auf den Schlüsselschrank... wäre etwas chaotisch 
Globale Variablen sehen zunächst viel geiler aus, klar, wozu auch eingrenzen. Aber das hängt immer mit der Größe eines Projekts ab. Wenn in einer 5-Mann-Firma jeder an die Schlüssel darf, ist das sicher auch nicht so ein großes Problem

Globale Variablen sehen zunächst viel geiler aus, klar, wozu auch eingrenzen. Aber das hängt immer mit der Größe eines Projekts ab. Wenn in einer 5-Mann-Firma jeder an die Schlüssel darf, ist das sicher auch nicht so ein großes Problem



ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Was hierbei auch eine sehr nette Methode ist: Protected <variable>
Das Bedeutet, das du innerhalb eine Function/Procedure den Varieblen Namen geben kannst, die du vllt zZ oder später als 'Global' deffiniert hast.
Das finde ich nämlich eine sehr schöne Möglichkeit.
Das Bedeutet, das du innerhalb eine Function/Procedure den Varieblen Namen geben kannst, die du vllt zZ oder später als 'Global' deffiniert hast.
Code: Alles auswählen
Global var.b
Procedure Function()
Protected var.s
var = "Hello World!"
EndProcedure