Seite 2 von 2

Re: Variablen reseten

Verfasst: 27.04.2014 18:02
von NicTheQuick
Der Punkt ist eher, dass deine DataSection-Variante ins Auge gehen kann, wenn man versucht Strings zu verändern. Die liegen nämlich in dem Fall nicht auf dem Heap, sondern auf dem Stack und da sollte man spätere dynamische Stringänderungen tunlichst vermeiden.
Das sieht man auch schon deutlich an stark unterschiedlichen Adressen:

Code: Alles auswählen

Debug @"Statischer String"
Define s.s = "Dynamischer String"
Debug @s
So ist es korrekt:

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
  Default_Values:
  Data.i 1337
  Data.b 23
  Data.i @"Hallo Welt!"
EndDataSection

*vars.vTable = AllocateMemory(SizeOf(vTable))
CopyStructure(?Default_Values, *vars, vTable)

Debug *vars\EinInteger
Debug *vars\EinByte
Debug *vars\EinString

*vars\EinString = "Neuer viel längerer String um zu sehen, dass nichts passiert, weil dieser Strings sich in einem ganz anderen Speicherbereich befindet wie der ursprüngliche in der DataSection."

Debug *vars\EinString

;Zurücksetzen
CopyStructure(?Default_Values, *vars, vTable)

Debug *vars\EinInteger
Debug *vars\EinByte
Debug *vars\EinString

Re: Variablen reseten

Verfasst: 27.04.2014 18:35
von _sivizius

Code: Alles auswählen

DataSection
  Default_Values:
  Data.i 1337
  Data.b 23
  Data.i 0
EndDataSection
*vars.vTable = AllocateMemory(SizeOf(vTable))
;{ Alle Strings setzen:
  *vars\EinString = "Stringtheorie!"
  Debug *vars\EinString
;}
kommt wohl einfacher. Also dass man keinen String per Default in eine DataSection einfügen soll.
Außerdem muss ich erwähnen, dass wenn man alle Variablen speichert, man auch alle referenzierten Strings speichern muss sowie die Referenzen ändern!
Man kann das aber mit Prozeduren oder Makros lösen, am besten mit einem Interface.