Seite 1 von 1

[Gelöst] Variable Arraygröße in Struktur

Verfasst: 07.02.2015 19:58
von BI2
Hallo zusammen,

ich habe zur Zeit folgendes Problem, ich empfange einen Datenstrom über das Netzwerk, den ich zur leichteren Verarbeitung Strukturieren möchte.
Abhängig von der Anwendung des Programms soll es möglich sein die Arraygröße in "Struktur2" (siehe Code Beispiel) über eine Konfigurationsdatei anzupassen.
Hat vielleicht jemand eine Idee wie man so etwas bewerkstelligen kann oder muss ich das Programm für jeden individuellen Fall mit Konstanter Arraygröße neu kompilieren?

Code: Alles auswählen

EnableExplicit

#KonstanteArrayGroesse = 5

Define VariableArrayGroesse.i = 5 ; Wert soll beim Programmstart aus einer Konfigurationsdatei geladen werden und wird dann nicht mehr geändert

Structure Struktur1
	S1Wert1.a
	S1Wert2.a
	S1Wert3.a
EndStructure

Structure Struktur2
	S2Wert1.a
	S2Wert2.a
	S2Wert3.a
	S2Anhang.Struktur1[#KonstanteArrayGroesse] ; hier brauche ich eigentlich S2Anhang.Struktur1[VariableArrayGroesse]
EndStructure

Debug SizeOf(Struktur2)

Define *TestVar.Struktur2 = AllocateMemory(SizeOf(Struktur2))

;Simulation des ankommenden Netzwerkdatenstroms
PokeS(*TestVar, "Testtext_'18'-Byte", 18, #PB_String_NoZero | #PB_Ascii)

Debug Chr(*TestVar\S2Wert3) ; sollte 's' anzeigen

Debug Chr(*TestVar\S2Anhang[4]\S1Wert1) ; sollte 'y' anzeigen
Bin für jeden Tipp dankbar.

Gruß, BI2

Re: Variable Arraygröße in Struktur

Verfasst: 07.02.2015 20:17
von STARGÅTE
Du kannst das mit dem Schlüsselwort Array machen:

Code: Alles auswählen

Structure Struktur2
   S2Wert1.a
   S2Wert2.a
   S2Wert3.a
   Array S2Anhang.Struktur1(0) ; Runde Klammern!
EndStructure
und damit zunächst das Array mit einer beliebigen Größe definieren und dann zur LAufzeit im Code dann erweitern:

Code: Alles auswählen

Dim *TestVar\S2Anhang(VariableArrayGroesse)

Re: Variable Arraygröße in Struktur

Verfasst: 07.02.2015 20:30
von Nino
Alternative zu Stargates Vorschlag:

Code: Alles auswählen

Structure Struktur2
   S2Wert1.a
   S2Wert2.a
   S2Wert3.a
   S2Anhang.Struktur1[0]   ; Durch die 0 (in eckigen Klammern) ist hier ein Array, dessen Grenzen von PB nicht geprüft werden!
EndStructure
Du kannst -- um nicht zu sagen "musst" :-) -- die variable Größe dann hier berücksichtigen:

Code: Alles auswählen

Define *TestVar.Struktur2 = AllocateMemory(<erforderliche Größe>)

Re: Variable Arraygröße in Struktur

Verfasst: 07.02.2015 20:46
von BI2
Vielen Dank für die Tipps,

@Stargate: irgendwie hat das mit dem neudimensionieren nicht hingehauen, ich habe immer ungültige Speicherzugriffsfehler erhalten. Trotzdem Danke für die Unterstützung

@Nino: der Tip mit dem [0] Array war Gold Wert. So funktioniert es nun:

Code: Alles auswählen

EnableExplicit

Define VariableArrayGroesse.i = 5 ; Wert soll beim Programmstart aus einer Konfigurationsdatei geladen werden und wird dann nicht mehr geändert

Structure Struktur1
	S1Wert1.a
	S1Wert2.a
	S1Wert3.a
EndStructure

Structure Struktur2
	S2Wert1.a
	S2Wert2.a
	S2Wert3.a
	S2Anhang.Struktur1[0]
EndStructure

Debug SizeOf(Struktur2) + VariableArrayGroesse * SizeOf(Struktur1)

Define *TestVar.Struktur2 = AllocateMemory(SizeOf(Struktur2) + VariableArrayGroesse * SizeOf(Struktur1))

;Simulation des ankommenden Netzwerkdatenstroms
PokeS(*TestVar, "Testtext_'18'-Byte", 18, #PB_String_NoZero | #PB_Ascii)

Debug Chr(*TestVar\S2Wert3) ; sollte 's' anzeigen

Debug Chr(*TestVar\S2Anhang[4]\S1Wert1) ; sollte 'y' anzeigen
Gruß, BI2