string mit fester länge
-
- Beiträge: 282
- Registriert: 03.01.2005 11:36
string mit fester länge
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
z.B.
Structure Tabelle
eMail.s
Name$
Zahl.f
Zahl.w
EndStructure
Danke fürs helfen
- 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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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
.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.
And we're out of beta. We're releasing on time.
- Froggerprogger
- Badmin
- Beiträge: 855
- Registriert: 08.09.2004 20:02
Es gibt noch etwas in diesem Rahmen zu beachten:
Wenn man innerhalb einer Struktur einen String per
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
dann werden die einzelnen Zeichen des Strings tatsächlich im Speicherbereich der Struktur gehalten und die Strukturgröße verändert sich entsprechend um 20.
Wenn man innerhalb einer Struktur einen String per
Code: Alles auswählen
name.s
Nutzt du ein Bytearray, wie z.B. durch
Code: Alles auswählen
name.b[20]
!UD2
- 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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- 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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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.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.
- 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
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:Die + 1 ist Wohl für das Nullbyte, das sowieso angehängt wird 
PS: Deswegen finde ich es immer lustig, wenn ich dieses sehe:
Code: Alles auswählen
Buffer.s = Space(#MAX_PATH + 1)

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
