Variablen reseten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Variablen reseten

Beitrag 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
Benutzeravatar
_sivizius
Beiträge: 98
Registriert: 23.10.2013 15:21

Re: Variablen reseten

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