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.