string mit fester länge

Anfängerfragen zum Programmieren mit PureBasic.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

string mit fester länge

Beitrag von Martin66119 »

Wie kann ich den in einer Structur einen String, einen Integerwert oder einen Floatwert mit fester länge definieren
z.B.

Structure Tabelle
eMail.s
Name$
Zahl.f
Zahl.w
EndStructure

Danke fürs helfen
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Mit Strings kannste es so lösen:

Code: Alles auswählen

Structure Tabelle
  eMail.b[40]
  Name.b[50]
EndStructure

tab.Tabelle
eMail.s = "BillGates@Microsoft.com"
Name.s = "Max Mustermann"

PokeS(@tab\eMail[0], Left(eMail, 40))
PokeS(@tab\Name[0], Left(Name, 50))

Debug PeekS(@tab\eMail, 40)
Debug PeekS(@tab\Name, 50)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Integer und Floats haben eine feste Länge.

.w - 2 Bytes
.l - 4 Bytes
.f - 4 Bytes


Bei Strings sieht das anders aus. Man könnte ein paar Bytes bis zur gewünschten Stringgröße aneinander gruppieren und dann einzelnd auslesen.

Structure
Name.b[8] ; 8 Bytes in Folge
EndStructure
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Es gibt noch etwas in diesem Rahmen zu beachten:

Wenn man innerhalb einer Struktur einen String per

Code: Alles auswählen

name.s
definiert, wird innerhalb der Struktur sowieso nur ein Pointer auf den tatsächlichen String gespeichert. Dieser hat immer die Größe von 4 Bytes, so dass sich die Strukturgröße (Wert von SizeOf()) unabhängig von der tatsächilchen Stringlänge um 4 vergrößert.

Nutzt du ein Bytearray, wie z.B. durch

Code: Alles auswählen

name.b[20]
dann werden die einzelnen Zeichen des Strings tatsächlich im Speicherbereich der Struktur gehalten und die Strukturgröße verändert sich entsprechend um 20.
!UD2
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Es ist evtl. auch Besser, das ByteArray ein Byte grösser zu machen, so das immer ein Nullbyte vorhanden ist und man sich bei PeekS die längenangabe sparen kann.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Nicht nur eventuell, der 0-terminator ist eigentlich Pflicht bei Strings. Allein um den Standard zu erhalten sollte man sich das angewöhnen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Naja, wenn ich PeekS mit einer bestimmten länge mache, hängt PB ja automatisch ein Nullbyte an, sonst könnte PB den String ja garnicht verwalten. Ist jetzt aber eher eine Vermutung, basierend auf logischen Überlegungen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Nur für fortgeschrittene Programmierer. Sehr nützlich, um einen String an der angegebenen Speicheradresse auszulesen. Der String muss mit einem '0' Zeichen enden, andernfalls wird der Speicher solange ausgelesen, bis eine '0' auftritt. Ein optionaler Parameter 'Länge' (in Bytes) kann angegeben werden.
Also bei PeekS muss jedenfalls, wenn man den ganzen String auslesen will und sich dessen Länge nicht merken will, eine 0 abschließen. Und im resultierenden String wird wohl diese 0 mit dran gehängt, sonst wär's ja kein Datentyp string, da hast du recht, ts-soft. Ich meinte aber eher, dass man beim reservieren des Speichers noch +1 für den 0er bereithalten sollte und diesen dann auch damit füllt, da dies nunmal für Strings so üblich ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Das entspricht ja dem, was ich vorher geschrieben habe, lieber ein Byte grösser. Die Initialisierung mit Null kann man sich aber sparen, PB initialisiert den Speicher immer mit Null, jedenfalls hab ich es noch nicht anders erlebt!

PS: Deswegen finde ich es immer lustig, wenn ich dieses sehe:

Code: Alles auswählen

Buffer.s = Space(#MAX_PATH + 1)
Die + 1 ist Wohl für das Nullbyte, das sowieso angehängt wird :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten