Seite 1 von 1
string mit fester länge
Verfasst: 26.10.2005 11:46
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
Verfasst: 26.10.2005 12:04
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)
Verfasst: 26.10.2005 12:05
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
Verfasst: 26.10.2005 12:53
von Froggerprogger
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.
Verfasst: 26.10.2005 13:26
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.
Verfasst: 26.10.2005 14:25
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.
Verfasst: 26.10.2005 14:29
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.
Verfasst: 26.10.2005 14:36
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.
Verfasst: 26.10.2005 14:41
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:
Die + 1 ist Wohl für das Nullbyte, das sowieso angehängt wird
