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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
BI2
Beiträge: 146
Registriert: 26.11.2006 19:07

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

Beitrag 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
Zuletzt geändert von BI2 am 07.02.2015 20:49, insgesamt 1-mal geändert.
PB 5.7x (x64), LinuxMint 18.3 - Xfce (x64)

Einsteigerbuch: PureBasic - Eine Einführung in die Computer Programmierung
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Variable Arraygröße in Struktur

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Variable Arraygröße in Struktur

Beitrag 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>)
Benutzeravatar
BI2
Beiträge: 146
Registriert: 26.11.2006 19:07

Re: Variable Arraygröße in Struktur

Beitrag 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
PB 5.7x (x64), LinuxMint 18.3 - Xfce (x64)

Einsteigerbuch: PureBasic - Eine Einführung in die Computer Programmierung
Antworten