Vorschlag eines komplexen Beispieles für die Kapitel Memory, Strukturen und Zeiger:
enthalten: Strukturen
Code: Alles auswählen
Structure Eigenschaft_A
Eigenschaft_A1.a
Eigenschaft_A2.a
EndStructure
enthalten: Strukturen in Strukturen
Code: Alles auswählen
Structure C3
C3_1.a
C3_2.a
EndStructure
Structure Eigenschaft_C
Eigenschaft_C1.a
Eigenschaft_C2.a
Eigenschaft_C3.C3
Eigenschaft_C4.a
EndStructure
enthalten: überlagerte Strukturen
enthalten: undefinierte Arrays in Strukturen
enthalten: Zeiger in Strukturen
Code: Alles auswählen
Structure Simulationsobjekt
Eigenschaft_SO.a ; eine nichtdynamische Eigenschaft
*Speicher_SO ; Speicherblockzeiger für dynamische Eigenschaften
EndStructure
enthalten: strukturierte Arrays
Code: Alles auswählen
For i = 0 To Simzaehler_A - 1 ; Eigenschaften A mit Testdaten füllen
Eigenschaften_A(i)\Eigenschaft_A1 = 11 + Random(8)
Eigenschaften_A(i)\Eigenschaft_A2 = 11 + Random(8)
Next i
enthalten: Zeigerarithmetik mit SizeOf()
Code: Alles auswählen
Bedarf = SizeOf(Zaehler) + Simzaehler_A * SizeOf(Eigenschaft_A) ; Speicherbedarf berechnen
Bedarf + Simzaehler_B * SizeOf(Eigenschaft_B)
Bedarf + Simzaehler_C * SizeOf(Eigenschaft_C)
enthalten: AllocateMemory()
enthalten: Syntax: Zeiger in Arrays ohne " * "
Code: Alles auswählen
Simulationsobjekte(a)\Speicher_SO = *Speicheranfang ; Speicherblock dem Simulationsobjekt zuweisen
enthalten: temporäre flexible Zeiger
Code: Alles auswählen
*Tempzeiger.Flexibler_Zeiger = *Speicheranfang ; temporären flexiblen Zeiger auf den Anfang setzen
enthalten: komplette Strukturen in den Speicherblock schreiben
Code: Alles auswählen
For i = 0 To Simzaehler_A - 1 ; Eigenschaften A in Speicherblock schreiben
*Tempzeiger\Eigenschaften_A[i] = Eigenschaften_A(i)
Next i
enthalten: Werkzeug Speicheranzeige und Funktion MemorySize()
Code: Alles auswählen
ShowMemoryViewer(Simulationsobjekte(a)\Speicher_SO, MemorySize(Simulationsobjekte(a)\Speicher_SO))
Das Beispiel ist von grundlegender Natur mit allgemeinem Nutzen. Es zeigt, wie Speicherblöcke einem Array zugewiesen werden und wie unterschiedliche Mengen von
verschiedenen Strukturen in einen Speicherblock geschrieben werden. Einige der aufgeführten Elemente fehlen bisher in der Hilfe und ich musste mir vieles durch Ausprobieren selber aneignen. Danke auch an Stargate und die anderen, die mir diesbezüglich geholfen haben.
Code: Alles auswählen
; Dieses Beispiel zeigt die Erstellung von Speicherblöcken in Arrays und
; das Schreiben dynamischer Eigenschaften mit unterschiedlichen Strukturen in einen Speicherblock.
; Der Einsatz ist bei der Verwendung von vielen Objekten sinnvoll, weil dann Listen in Arrays
; extrem viel Speicherplatz benötigen würden.
; Aufbau eines Speicherblockes: Zähler A, Zähler B, Zähler C, x Eigenschaften A, y Eigenschaften B, z Eigenschaften C
; sollen Strings in den dynamischen Eigenschaften enthalten sein, so müssen das statische Strings sein
#Max_Objekte = 3
Structure Eigenschaft_A
Eigenschaft_A1.a
Eigenschaft_A2.a
EndStructure
Structure Eigenschaft_B
Eigenschaft_B1.a
Eigenschaft_B2.a
Eigenschaft_B3.a
EndStructure
Structure C3
C3_1.a
C3_2.a
EndStructure
Structure Eigenschaft_C
Eigenschaft_C1.a
Eigenschaft_C2.a
Eigenschaft_C3.C3
Eigenschaft_C4.a
EndStructure
Structure Zaehler
Zaehler_A.l
Zaehler_B.l
Zaehler_C.l
EndStructure
Structure Flexibler_Zeiger
StructureUnion ; überlagerte Zeigerstrukturen
Zaehler.Zaehler
Eigenschaften_A.Eigenschaft_A[0] ; undefinierte Arrays
Eigenschaften_B.Eigenschaft_B[0]
Eigenschaften_C.Eigenschaft_C[0]
EndStructureUnion
EndStructure
Structure Simulationsobjekt
Eigenschaft_SO.a ; eine nichtdynamische Eigenschaft
*Speicher_SO ; Speicherblockzeiger für dynamische Eigenschaften
EndStructure
Dim Simulationsobjekte.Simulationsobjekt(#Max_Objekte - 1) ; Simulationsobjekte
Define.l Simzaehler_A, Simzaehler_B, Simzaehler_C ; Zähler mit Typ Long definieren
Define.i Bedarf, Offset ; Bedarf und Offset mit Typ Integer definieren
For a = 0 To #Max_Objekte - 1
Simulationsobjekte(a)\Eigenschaft_SO = 1 + Random(8) ; eine nichtdynamische Eigenschaft des Simulationsobjektes, die direkt im Array gespeichert wird
Simzaehler_A = Random(2) + 2 ; Anzahl Eigenschaften A: 2 bis 4 diese dynamischen Eigenschaften müssen in den Speicherblock
Simzaehler_B = Random(2) + 2 ; Anzahl Eigenschaften B: 2 bis 4
Simzaehler_C = Random(2) + 2 ; Anzahl Eigenschaften C: 2 bis 4
Dim Eigenschaften_A.Eigenschaft_A(Simzaehler_A - 1) ; Eigenschaften anlegen
Dim Eigenschaften_B.Eigenschaft_B(Simzaehler_B - 1)
Dim Eigenschaften_C.Eigenschaft_C(Simzaehler_C - 1)
For i = 0 To Simzaehler_A - 1 ; Eigenschaften A mit Testdaten füllen
Eigenschaften_A(i)\Eigenschaft_A1 = 11 + Random(8)
Eigenschaften_A(i)\Eigenschaft_A2 = 11 + Random(8)
Next i
For i = 0 To Simzaehler_B - 1 ; Eigenschaften B mit Testdaten füllen
Eigenschaften_B(i)\Eigenschaft_B1 = 21 + Random(8)
Eigenschaften_B(i)\Eigenschaft_B2 = 21 + Random(8)
Eigenschaften_B(i)\Eigenschaft_B3 = 21 + Random(8)
Next i
For i = 0 To Simzaehler_C - 1 ; Eigenschaften C mit Testdaten füllen
Eigenschaften_C(i)\Eigenschaft_C1 = 31 + Random(8)
Eigenschaften_C(i)\Eigenschaft_C2 = 31 + Random(8)
Eigenschaften_C(i)\Eigenschaft_C3\C3_1 = 41 + Random(8)
Eigenschaften_C(i)\Eigenschaft_C3\C3_2 = 41 + Random(8)
Eigenschaften_C(i)\Eigenschaft_C4 = 51 + Random(8)
Next i
Bedarf = SizeOf(Zaehler) + Simzaehler_A * SizeOf(Eigenschaft_A) ; Speicherbedarf berechnen
Bedarf + Simzaehler_B * SizeOf(Eigenschaft_B)
Bedarf + Simzaehler_C * SizeOf(Eigenschaft_C)
*Speicheranfang = AllocateMemory(Bedarf)
If *Speicheranfang
Simulationsobjekte(a)\Speicher_SO = *Speicheranfang ; Speicherblock dem Simulationsobjekt zuweisen
*Tempzeiger.Flexibler_Zeiger = *Speicheranfang ; temporären flexiblen Zeiger auf den Anfang setzen
*Tempzeiger\Zaehler\Zaehler_A = Simzaehler_A ; Eigenschaftenzähler A, B, C in Speicherblock schreiben
*Tempzeiger\Zaehler\Zaehler_B = Simzaehler_B
*Tempzeiger\Zaehler\Zaehler_C = Simzaehler_C
Offset = SizeOf(Zaehler) ; Zeigerverschiebung ermitteln
*Tempzeiger = *Speicheranfang + Offset ; Zeiger weiterrücken
For i = 0 To Simzaehler_A - 1 ; Eigenschaften A in Speicherblock schreiben
*Tempzeiger\Eigenschaften_A[i] = Eigenschaften_A(i)
Next i
Offset + Simzaehler_A * SizeOf(Eigenschaft_A) ; Offset erhöhen
*Tempzeiger = *Speicheranfang + Offset ; Zeiger weiterrücken
For i = 0 To Simzaehler_B - 1 ; Eigenschaften B in Speicherblock schreiben
*Tempzeiger\Eigenschaften_B[i] = Eigenschaften_B(i)
Next i
Offset + Simzaehler_B * SizeOf(Eigenschaft_B) ; Offset erhöhen
*Tempzeiger = *Speicheranfang + Offset ; Zeiger weiterrücken
For i = 0 To Simzaehler_C -1 ; Eigenschaften C in Speicherblock schreiben
*Tempzeiger\Eigenschaften_C[i] = Eigenschaften_C(i)
Next i
EndIf
Next a
MessageRequester("Hinweis", "Bitte nutzen Sie in den folgenden Speicheranzeigen die Byte-Tabelle und ziehen Sie das Fenster ausreichend groß.")
For a = 0 To #Max_Objekte - 1
If Simulationsobjekte(a)\Speicher_SO
ShowMemoryViewer(Simulationsobjekte(a)\Speicher_SO, MemorySize(Simulationsobjekte(a)\Speicher_SO))
If a < #Max_Objekte - 1
MessageRequester("Weiter", "Weiter gehts.")
EndIf
Else
MessageRequester("Fehler", "Speicherblock konnte nicht angelegt werden.")
EndIf
Next a
Rainer Ullmann
Edit: String-Hinweis ergänzt.