Seite 1 von 1

Alle Variablen auf einmal "globalisieren"

Verfasst: 22.01.2008 18:59
von D4uS1
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?

Verfasst: 22.01.2008 19:06
von Fluid Byte
Nein.

Verfasst: 22.01.2008 19:20
von Kaeru Gaman
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)

Verfasst: 22.01.2008 19:55
von D4uS1
ok, nur eine Frage noch, was genau ist denn der Unterschied zwischen globalen Variablen und normalen, abgesehen davon das man die einen überall verwenden kann?

Verfasst: 22.01.2008 20:11
von inc.
Am besten du erstellst einen Kontext für deine Applikation.

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)
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:

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
... 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.

Verfasst: 22.01.2008 21:19
von ZeHa
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 ;)

Verfasst: 23.01.2008 00:19
von IceFish
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.

Code: Alles auswählen

Global var.b

Procedure Function()
 Protected var.s
 var = "Hello World!"
EndProcedure 
Das finde ich nämlich eine sehr schöne Möglichkeit.