Seite 1 von 2

Variablen reseten

Verfasst: 27.04.2014 15:40
von Purebasium
Gibt es eine Möglichkeit, mitten im Programm alle bisher definierten Variablen zu reseten, ohne das man alle einzeln auf null stellt?

Re: Variablen reseten

Verfasst: 27.04.2014 15:42
von RSBasic
Du kannst deine einmalige Variablenliste in einer Include einfügen. Diese Include-Datei rufst du erneut auf, wenn du sie resetten möchtest.

Re: Variablen reseten

Verfasst: 27.04.2014 15:56
von Purebasium
es gibt ja unter Werkzeuge->variablenliste eine liste aller variablen.
Kann man die irgendwie speichern/kopieren?

Re: Variablen reseten

Verfasst: 27.04.2014 16:00
von RSBasic
Nein direkt nicht. Du kannst natürlich ein Werkzeug erstellen und automatisiert vor dem Kompilieren die Variablen ermitteln und resetten, aber das ist viel zu aufwändig.
Die einfachste Möglichkeit ist eine separate Include-Datei für deine Variablen.

Re: Variablen reseten

Verfasst: 27.04.2014 16:06
von Purebasium
ok
(Bin schon beim abschreiben der variablen :cry: )

Re: Variablen reseten

Verfasst: 27.04.2014 16:08
von RSBasic
Wenn du EnableExplicit verwendest und oben eine Variablenliste besitzt, dann musst du nichts abschreiben, sondern nur auslagern.

Re: Variablen reseten

Verfasst: 27.04.2014 16:53
von NicTheQuick
Eine zweite Möglichkeit wäre eine Macro. Einfach in dem Makro alle Variablen mit Initialwert auflisten und dann an beliebigen Stellen aufrufen. Das braucht nicht unbedingt dann eine extra Include.

Re: Variablen reseten

Verfasst: 27.04.2014 17:30
von _sivizius

Code: Alles auswählen

;1. Eine Struktur mit allen Variablen
Structure vTable
  EinInteger.i
  EinByte.b
  EinString.s
  ;...
EndStructure
;2a. Wir können alle Variablen im Programm speichern
DataSection
  variablen:
  Data.i 1337
  Data.b 23
  Data.i @"Hallo Welt!"
EndDataSection
*versionA.vTable = ?variablen
;2b oder Allozieren und zuweisen. Verschwendet unnötig Speicher!
*versionB.vTable = AllocateMemory(SizeOf(vTable))
*versionB\EinInteger = 0815
*versionB\EinByte = 42
*versionB\EinString = "Stringtheorie!"
;3. beide Versionen lassen sich aber gleich setzen
*versionA\EinInteger = 1234567
*versionB\EinString = "PureBasic!"
;4. und aufrufen
Debug *versionA\EinString
Debug *versionB\EinByte
;5. alle Werte auf einen bestimmten Wert setzen geht auch:
FillMemory(*versionA, SizeOf(vTable), 23)
Debug *versionA\EinByte ; Vorsicht mit Strings!!!
FillMemory(*versionB, SizeOf(vTable), 42)
Debug *versionB\EinByte ; Das geht sonst schief!
;6. und auch problemlos Speichern.
file = OpenFile(-1, GetCurrentDirectory()+"vTable.dat")
If IsFile(file)
  WriteData(file, *versionA, SizeOf(vTable))
  CloseFile(file)
EndIf
;7. und auch problemlos wieder Laden.
file = OpenFile(-1, GetCurrentDirectory()+"vTable.dat")
If IsFile(file)
  ReadData(file, *versionB, SizeOf(vTable))
  CloseFile(file)
EndIf
;8. man kann auch eine Variablen-Liste verdoppeln
*versionC.vTable = 0
CopyMemory(*versionA, *versionC, SizeOf(vTable))
;9. und sogar vergleichen!
Debug CompareMemory(*versionA, *versionC, SizeOf(vTable))
;gleiche Strings, aber mit unterschiedlicher Adresse sind verschieden :/
;man kann aber Variable für Variable vergleichen!

Re: Variablen reseten

Verfasst: 27.04.2014 17:39
von ts-soft
@_sivizius

Code: Alles auswählen

GetCurrentDirectory() <> GetPathPart(ProgramFilename())
CurrentDirectory, ist das Directory, welches vom starter des Processes übergeben wurde, also nicht unbedingt das Verzeichnis der Exe!
Bei Aufruf per Shell wird im allg. kein "Ausführungsverzeichnis (CurrentDir)" übergeben, so das dies meist auf den Systemordner verweist.

GetCurrentDirectory() ist nur sinnvoll, wenn man den Ordner selber per SetCurrentDirectory() gesetzt hat.

Re: Variablen reseten

Verfasst: 27.04.2014 17:43
von _sivizius
oder man es eben in der IDE ausführt und vorher irgendwo gespeichert hat.
In der shell ist auch das Debug nicht mehr so sinnvoll :P.
Aber das ist hier nicht der Punkt.