Seite 1 von 1
Strukturwahn
Verfasst: 10.03.2007 23:59
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?
Verfasst: 11.03.2007 00:10
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.
Verfasst: 12.03.2007 07:28
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.
Verfasst: 12.03.2007 14:38
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