PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktion um einen String Array zu leeren "loeschen"



sato
15.06.2009, 15:41
Hallo

Gibts es in Bascom eine Funktion um einen String Array zu leeren "loeschen"?
Oder nuss man es in einen For/Next loop alle variabeln des array loeschen?

Gruss
Sato

PicNick
15.06.2009, 16:09
Fürchte, da is nix zu machen.
Um wieviele Elemente geht es denn ?
Zeitkritische Sache ?

sato
15.06.2009, 16:19
Hallo Picknick

Es ist ein String Array von etwa 100 Elemente die in eine ISR routine von der Seriellen Schnitstelle eingesammelt werden.
Nachdem die String Array Voll ist, teste ich die ersten 4 Zeichen, fals die nicht korrekt sind, dann stimmen die gesammelten Daten nicht und danach möchte ich diesen Array leeren. Da es anscheinend keinen Befehl in Bascom dafür existiert, werde es wahscheinlich so machen müssen.

dim zeichen as string * 100

for i = 1 to 100
zeichen(i) = ""
next

Gruss
Sato

for_ro
15.06.2009, 16:30
Du sprachst anfangs von einem String-Array. Darauf bezog sich PicNicks Antwort.
Wenn du nur einen String der Länge 100 hast, brauchst du nur auf die erste Stelle ein Null-Byte zu schreiben, und schon ist der String leer. Die noch dahinter stehenden zeichen werden von allen String Funktionen ignoriert.
Dazu brauchst du nur Zeichen="" einzugeben.


dim zeichen as string * 100

for i = 1 to 100
zeichen(i) = ""
next


Zeichen(i) = "" geht allerdings nicht. Dazu müsstest du ein Byte Array über den String legen. Dann kannst du jede Stelle direkt adressieren.

Gruß

Rolf

Netzman
15.06.2009, 17:04
Wozu überhaupt leeren? Die falschen Daten einfach nicht auszuwerten genügt doch, dafür reicht zb. eine Bit-Variable:
Received_Nice_Data = 1
...
If Received_Nice_Data = 1 Then
' auswerten

mfg

sato
15.06.2009, 17:32
Hallo Netzman

Hat Recht, wozu leeren, die werden sowieso überschrieben.

Danke

Gruss
Sato

peterfido
15.06.2009, 23:24
Ein Versuch wäre folgendes wert:

dim zeichen(100) as string * 1
dim sleer as string *100 at zeichen overlay

zum leeren dann sleer=""

Falls das nicht geht würde ich eine long-Variable als Array im Overlay Dimensionieren, so brauchts dann nur noch 25 statt 100 Durchgänge beim auf 0 setzen.

for_ro
16.06.2009, 06:44
Ein Versuch wäre folgendes wert:

dim zeichen(100) as string * 1
dim sleer as string *100 at zeichen overlay

zum leeren dann sleer=""

Geht zwar an der eigentlichen Frage vorbei, aber warum nicht. Nur:
dim zeichen(100) as string * 1
belegt tatsächlich 200 Byte im SRAM (Null-Byte!), während
dim sleer as string *100 at zeichen overlay
nur die ersten 101 davon belegt.
sleer=""
setzt Zeichen(1)="" und sleer auf "", alles andere bleibt wie es ist.


Falls das nicht geht würde ich eine long-Variable als Array im Overlay Dimensionieren, so brauchts dann nur noch 25 statt 100 Durchgänge beim auf 0 setzen.
Eine Long-Variable wird natürlich auch nicht in einem Befehl auf 0 gesetzt, sondern in 4 Byte Schritten. Ob eine Long auf 0 setzen schneller geht als einen String auf "" zu setzen, müsste man mal ausprobieren, glaube ich aber nicht.
Außerdem brauchst du wieder 50 Long Variablen um die 200 String-Byte abzudecken.
Du setzt dabei am Ende 200 Byte auf 0. Wenn du ein Byte-Array drüberlegst und nur jedes zweite Byte - die wo die Zeichen des Strings liegen - auf 0 setzt, sind es halt nur 100 Zuweisungen.

Gruß

Rolf

Netzman
16.06.2009, 12:32
Noch schneller gehts mit Memcopy, wie jemand im englischen Forum bemerkt hat ;)

mfg