Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Frage zu copy , pos


foxy - Mo 16.06.03 10:13
Titel: Frage zu copy , pos
guden

hab nur ne kurze frage

Quelltext
1:
 if copy(msg , Pos(':',msg)+1,1) = '-' then                    


wiso gibt der mir hier kein wert zurück ? also von pos kommt kein wert, und dementsprechend von copy ja auch nicht.

die msg heist z.b.

asd: -xxxxxxx

sieht einer einen fehler?


AndyB - Mo 16.06.03 10:32

Er liefert dir sehr wohl einen Wert und zwar ' '. Zwischen dem Doppelpunkt und dem Minuszeichen ist ein Leerzeichen. Wenn du also Doppelpunkt-Position + 1 machst, landest du beim Leerzeichen.


foxy - Mo 16.06.03 10:35

narf .... dank dir dann mach ich eben 2 :rofl:


foxy - Mo 16.06.03 11:15

also ich habs nu versuch ... geht imma noch nich

ich hab mal screens gemacht
erst der wert der msg
user defined image

und ich hab ein breakpüoint gesetzt dann bekommt der diesen wert raus
user defined image

hilft mir ahh :D


AndyB - Mo 16.06.03 11:46

Und warum holst du dir mit Copy nun 2 Zeichen? (Letzter Parameter von Copy). Wie sollen 2 Zeichen denn jemals einem Zeichen entsprechen?

Pos ist eine Funktion und keine Variable, die der Debugger so leicht anzeigen kann. Deswegen schreibt er auch "Niht verfügbarer Wert".


Delete - Mo 16.06.03 11:58
Titel: Re: Frage zu copy , pos
foxy hat folgendes geschrieben:

Delphi-Quelltext
1:
if copy(msg , Pos(':',msg)+1,1) = '-' then                    

Warum prüfst du nicht einfach nur:

Delphi-Quelltext
1:
if(pos('-',msg) > 0then { ... }                    

oder meinetwegen auch

Delphi-Quelltext
1:
if(pos('-',msg) > pos(':',msg)) then { ... }                    

oder

Delphi-Quelltext
1:
if(pos('-',msg) = pos(':',msg)+2)) then { ... }                    


?


foxy - Mo 16.06.03 12:04

hmmm .... ja das mach ich ... also das erste mathias geht nicht, weil dann würde ja immer die schleife eintreten, wenn ein minus in dem string wäre

die 2. möglichkeit versuch ich mal hört isch gut an *gg*
dank euch beiden


Popov - Mo 16.06.03 14:45

Besser, schneller und einfacher ist

if msg[Pos(':', msg) + 1] = '-' then

Allerdings auch gefährlicher. Denn hier kann auf ein Char zugegriffen werden, das nicht da ist (weil String zu kurz). Wenn man aber es ausschließen kann oder es vorher prüft, dann ist die Methode die einfachste.

Der Fehler kann aber auch bei der Copy-Version vorkommen, allerdings ohne eine Fehlermeldung. Bei Copy wird ein String zurückgegeben und ein String kann auch leer sein. Ein Char kann nicht leer sein, da er immer ein Zeichen lang ist. Es kann aber auch bei if copy(msg , Pos(':',msg)+1,1) vorkommen, daß das Ergebnis ein leerer String ist.


Popov - Mo 16.06.03 14:50

foxy hat folgendes geschrieben:
die 2. möglichkeit versuch ich mal hört isch gut an *gg*
dank euch beiden


Da kann es unter Umständen zu Problemen kommen. So wie ich es verstanden habe soll das "-" Zeichen gleich nach dem ":" Zeichen vorkommen. Die zweite Methode, so wie sie ist, kann einen falschen Wert zurückliefern, weil das "-" Zeichen auch X-Zeichen später kommen kann.

Deshalb eine kleine abgeänderte Alternative:


Quelltext
1:
if((pos('-',msg) - 1) = pos(':',msg)) then { ... }                    


Hier muß "-" gleich hinter ":" kommen.


Delete - Mo 16.06.03 15:56
Titel: Re: Frage zu copy , pos
Aber im Beispiel:
foxy hat folgendes geschrieben:
asd: -xxxxxxx

gibt es ein Leerzeichen nach dem Doppelpunkt, @Popov. Dann könnte man auch gleich

Delphi-Quelltext
1:
if(pos(': ',msg) < pos('-',msg)) then { ... }                    

ausprobieren, bzw.

Delphi-Quelltext
1:
if(pos(': ',msg) = pos('-',msg) - 2then { ... }                    

um auf Nr. Sicher zu gehen. :)


Popov - Mo 16.06.03 16:34

Also, um es ganz richtig zu machen und gut, muß man es sovieso anders machen. Ich zum Beispiel hab eine Engine für eine Scriptsprache geschrieben. Auch da muß ich Zeichen auslesen. Auch wenn Copy & Co. eine schnelle Methode gewesen wären, so hab ich für das auslesen der Zeichen eine eigenständige Funktion geschrieben. Neben dem, daß mir die Funktion das nächste Zeichen ausgibt, kann ich natürlich auch alle dazwischenliegenden Leerzeichen ignorieren. Damit nicht genug, sagt mir die Funktion auch den Status des Zeichen, z.B. OK, wenn ein Zeichen gelesen wurde oder ENDOFLINE, wenn kein Zeichen mehr gelesen werden konnte. Mit so einer Funktion brauch ich mich um die Kleinigkeiten des Lebens nicht mehr kümmern. Das ganze lohnt sich aber erst wenn man einen Parser schreibt. Aber falsch ist es nicht.