Strukturwahn

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Strukturwahn

Beitrag von Scarabol »

Hallo Leute,

ich bastel gerade an einem kleinen Projekt und dabei bin ich natürlich auch an Strukturen geraten. Das wiederum brachte mich zu der Frage welchen Code haltet ihr für sinnvoller, bzw. wann sollte man strukturierte Variablen verwenden und wann nicht? Besonders im Hinblick auf Übersicht und Speicherverbrauch.

Code: Alles auswählen

; Code1
Icon_Haus = 1
Icon_Auto = 2
Icon_Hund = 3
Icon_Katze = 4
usw.

Code: Alles auswählen

; Code2
Strukture Test
  Haus.l
  Auto.l
  Hund.l
  Katze.l
EndStructure

Icon.Test

Icon\Haus = 1
Icon\Auto = 2
Icon\Hund = 3
Icon\Katze = 4
Gruß
Scarabol

PS:
Kann man den Speicherbereich einer Variable auch wieder freigeben?
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Kann man den Speicherbereich einer Variable auch wieder freigeben?
Nein. Variablen werden freigegeben, wenn sie ihre Gültigkeit verlieren, also
Protected Variablen beim verlassen der Procedure, globale Variablen am
Ende des Programms.

Strukturierte Variablen sind leichter zu merken und zu handhaben. Innerhalb
von Strukturen kann man mit z. B. Byte-Variablen auch Speicherplatz sparen,
ausserhalb macht es keinen Sinn.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Strukturen sind auf jeden Fall sehr sinnvoll, da alle Elemente direkt hintereinander im Speicher liegen. Somit wird der Datenaustausch erleichtert (weil Du die komplette Struktur dann als Buffer behandeln kannst) und zudem kannst Du Strukturen auch vererben und casten, d.h. Du hast z.B. einen "Mensch" und ein "Tier", beide stammen vom "Lebewesen" ab, also kannst Du auch Funktionen schreiben, die mit "Lebewesen" herumhantieren, diesen aber auch direkt den "Mensch" oder das "Tier" übergeben und somit (bei gleicher Funktionalität) nicht für jedes Objekt eine Extrawurst basteln.

Inwiefern das nun bei Deinen Icons was bringt, weiß ich auch nicht, aber das wird wohl nur ein Beispiel gewesen sein. Sinnvoll ist es auf jeden Fall bei den Eigenschaften eines Objekts, egal ob das nun eine Spielfigur, ein Gegner, eine Karteikarte, ein Textdokument oder eine Sammlung globaler Optionen ist.

EDIT: Das war jetzt auf die Übersicht und Handlichkeit bezogen. Speicherverbrauch hat der ts-soft schon erklärt, da kann man sogar noch ein wenig sparen. Letztendlich sind es einfach nur die gleichen Variablen, die eben im Speicher direkt hintereinander angeordnet sind (unter Umständen eben dichter gepackt), und wenn Du drauf zugreifst, wird einfach die Adresse + ein entsprechender Offset verwendet.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

bei deinem beispiel kann ich nicht besonders einen sinn erkennen.

wenn es dir um sowas wie ne enum geht, ist ein array auf jeden fall besser geeignet als ne struct.

Code: Alles auswählen

Dim IconName.s(4)
Restore IconTable
For n=1 To 4
  Read IconName(n)
Next

DataSection
IconTable:
Data.s "Haus", "Auto", "Hund", "Katze"
EndDataSection
wenn du im programmverlauf die namen nicht brauchst, ergibt es nicht den geringsten sinn,
sie irgendwo zu verwenden, es sei denn als konstanten.

Code: Alles auswählen

Enumeration 
  #Icon_Haus
  #Icon_Auto
  #Icon_Hund
  #Icon_Katze
EndEnumeration
ansonsten schreib dir
Icon_Haus = 1
Icon_Auto = 2
Icon_Hund = 3
Icon_Katze = 4
auf nen zettel und verwende die zahlen direkt.
aber es ergibt keinen sinn, vier unterschiedliche variablen zu verwenden
(oder vier unterschiedliche felder einer struktur)
um eine einzige eigenschaft zu speichern.
du willst ja wohl die icon-nummern an der selben stelle verwenden, also z.b. um ein image zuzuordnen.


eine struct verwendet man dazu, um unterschiedliche eigenschaften von einer reihe elementen speichern zu können.

Code: Alles auswählen

Structure Icon 
  Number.l
  Name.s
  XSize.w
  YSize.w
EndStructure

NewList Symbols.Icon()

NameBuf.s = ""
XSBuf.w = 0
YSBuf.w = 0

Restore Table
For n=1 To 4
  Read NameBuf
  Read XSBuf
  Read YSBuf
  AddElement(Symbols())
  Symbols()\Number = n
  Symbols()\Name = NameBuf
  Symbols()\XSize = XSBuf
  Symbols()\YSize = YSBuf
Next

DataSection
  Table:
  Data.s "Haus"
  Data.w 64,64
  Data.s "Auto"
  Data.w 48,48
  Data.s "Hund"
  Data.w 32,32
  Data.s "Katze" 
  Data.w 24,24
EndDataSection

ForEach Symbols()
  Out$ = "Element Nr. " + Str(Symbols()\Number) + " is " 
  Out$ + Chr(34) + Symbols()\Name + Chr(34) 
  Out$ + ", Size: " + Str(Symbols()\XSize) + "x" + Str(Symbols()\YSize)
  Debug Out$
Next
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten