Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StrLen() vs. Length() (https://www.delphipraxis.net/43066-strlen-vs-length.html)

derpepe 28. Mär 2005 15:55


StrLen() vs. Length()
 
Was ist eigentlich der Unterschied zwischen den o.g. Funktionen?

Guckt euch mal das "Delphi Example" zu StrLen in der Delphi-Hilfe an, da findet sich folgender u.a. Code:
Delphi-Quellcode:
HalfLen := StrLen(PChar(string(Edit1.Text))) div 2;
Warum nicht
Delphi-Quellcode:
HalfLen := Length(Edit1.Text) div 2;
???

Bisher dachte ich StrLen für PChars und Length für Strings.
Laut dem Beispiel nehmen die da aber StrLen.
Warum?

Dax 28. Mär 2005 15:57

Re: StrLen() vs. Length()
 
Zitat:

Zitat von derpepe
Guckt euch mal das "Delphi Example" zu StrLen in der Delphi-Hilfe an

Warum da StrLen benutzt wird? Um die Funktion StrLen zu erklären, vermute ich mal ;)

malo 28. Mär 2005 16:00

Re: StrLen() vs. Length()
 
In diesem Beispiel ist wohl die Möglichkeit mit Length() besser. Allerdings gibt Length() einen String zurück, StrLen scheinbar ein PChar. Kommt also immer drauf an, was man grade braucht (PChar oder String). Weil das Umwandeln ist ja doch noch mühsame Tipparbeit :zwinker:

Mephistopheles 28. Mär 2005 16:00

Re: StrLen() vs. Length()
 
Es ist ein freche Behauptung, aber vielleicht weil String und PChar nicht das gleiche ist?!

Während nämlich ein PChar immer auf #0 endet, die Länge also die Anzahl der Zeichen bis zur #0 ist, ist ein String ein sogenannter gezählter Stringtyp. Das heißt, es gibt ein Feld welches zum String gehört, in dem die Anzahl der Zeichen im String angegeben ist. Dieses wird von Length() zurückgegeben und berücksichtigt nicht irgendwelche #0 im String.

derpepe 28. Mär 2005 16:01

Re: StrLen() vs. Length()
 
*g* dann gibt's für StrLen keinen besseren Verwendungszweck?
Das kann ja auch mal ned sein...
Irgendeine Daseinsberechtigung muss die Funktion doch haben, auch wenn diese mir momentan Rätsel aufgibt.

gordon freeman 28. Mär 2005 16:03

Re: StrLen() vs. Length()
 
Zitat:

Zitat von malo
Allerdings gibt Length() einen String zurück, StrLen scheinbar ein PChar.

Geben nicht beide Funktionen einen Integer-Wert zurück :gruebel:

sakura 28. Mär 2005 16:05

Re: StrLen() vs. Length()
 
Zitat:

Zitat von derpepe
Was ist eigentlich der Unterschied zwischen den o.g. Funktionen?

Length ist eine Pascal-Funktion, für welche der Compiler entscheidet wie diese eingesetzt wird (Typenabhängig). Für Strings die schnellste und einzig garantiert korrekte Variante.

StrLen ist eine Funktion, welche die Länge eines Null-terminierten Strings berechnet indem diese das erste #0 Zeichen sucht. Diese ist speziell für PChars.

Strings können #0 Zeichen enthalten, daher würde letztere Funktion evtl. einen Fehler zurückliefern, wenn diese für String Variablen genutzt wird.

PChars enden immer auf #0 und können somit kein #0 Character enthalten und kommen aus der C/C++ Ecke ;)

...:cat:...

Mephistopheles 28. Mär 2005 16:06

Re: StrLen() vs. Length()
 
Zitat:

Zitat von derpepe
*g* dann gibt's für StrLen keinen besseren Verwendungszweck?
Das kann ja auch mal ned sein...
Irgendeine Daseinsberechtigung muss die Funktion doch haben, auch wenn diese mir momentan Rätsel aufgibt.

Bitte bitte erst die Antworten lesen! Der Unterschied sollte wohl deutlich aus meiner obigen Ausführung hervorgehen (wie ich gerade sehe versucht es sakura gerade mit gleichen Ausführungen).
Schlimm genug, daß dieser Unterschied zwischen PChar und String nicht Allgemeinwissen eines Delphiprogrammierers zu sein scheint.

malo 28. Mär 2005 16:06

Re: StrLen() vs. Length()
 
Zitat:

Zitat von gordon freeman
Zitat:

Zitat von malo
Allerdings gibt Length() einen String zurück, StrLen scheinbar ein PChar.

Geben nicht beide Funktionen einen Integer-Wert zurück :gruebel:

:oops: Ich meine natürlich, StrLen wertet einen PChar aus, und Length einen String :mrgreen:

Und einen Thread zum Vergleich von PChar und String gabs ja schonmal ;)

Mephistopheles 28. Mär 2005 16:17

Re: StrLen() vs. Length()
 
Details, habe den Link soeben wiedergefunden, finden sich unter:
http://www.manuel-poeter.de/index.php?site=tutorials

Im "Strings"-Tutorial.

MathiasSimmack 28. Mär 2005 16:21

Re: StrLen() vs. Length()
 
Zitat:

Zitat von sakura
PChars enden immer auf #0 und können somit kein #0 Character enthalten und kommen aus der C/C++ Ecke ;)

Ich erinnere dich mal an die Dateiauswahl beim Öffnen-Dialog - nonVCL. :) Sicher, der PChar endet auf Null, er enthält aber diverse #0-Zeichen zwischendrin, mit denen die einzelnen Dateinamen voneinander getrennt werden.

Binärbaum 28. Mär 2005 16:24

Re: StrLen() vs. Length()
 
Zitat:

Zitat von MathiasSimmack
Zitat:

Zitat von sakura
PChars enden immer auf #0 und können somit kein #0 Character enthalten und kommen aus der C/C++ Ecke ;)

Ich erinnere dich mal an die Dateiauswahl beim Öffnen-Dialog - nonVCL. :) Sicher, der PChar endet auf Null, er enthält aber diverse #0-Zeichen zwischendrin, mit denen die einzelnen Dateinamen voneinander getrennt werden.

Und woher soll man dann wissen, welches #0 den PChar nun wirklich abschließt? :gruebel:

MathiasSimmack 28. Mär 2005 16:27

Re: StrLen() vs. Length()
 
Oh Ja, sorry, hätte ich sagen müssen: Der PChar endet mit #0#0. Das heißt, beim Versuch, den nächsten String der Liste anzuspringen, landest du auf dem zweiten #0-Zeichen und solltest die Schleife dann beenden. Funktioniert recht gut ;), wie du in den Win32-API-Tutorials von Luckie sehen würdest.

Mephistopheles 28. Mär 2005 16:28

Re: StrLen() vs. Length()
 
*Heul* ... und auch dies ist kein Problem, denn es ist nur eine Aneinanderreihung von PChars. Diese Methode wird bei den Performance Countern und überall angewandt. Unter Delphi muß man dann eben über alle PChars hinwegspringen, bis man zu einem #0#0 kommt - unter C wäre dies einfach ein

Code:
LPSTR pc;

while(lstrlen(pc))
  pc++;
Unter Delphi mußt du zum Pchar-Wert entsprechend die Länge des ersten PChars + 1 hinzuaddieren um direkt hinter der nächsten #0 zu landen. Dies muß man unter Delphi explizit tun, will heißen so "schön" wie in C sieht der Code dann nicht aus ;)

Ach ja, REG_MULTI_SZ speichert seine Werte exakt so. Eine clevere Erfindung (obwohl dazu nicht viel gehört), wie ich meine.

sakura 28. Mär 2005 16:31

Re: StrLen() vs. Length()
 
Zitat:

Zitat von MathiasSimmack
Oh Ja, sorry, hätte ich sagen müssen: Der PChar endet mit #0#0.

Gehört jetzt nicht hierher, aber kurz, das nennt sich dann aber auch PChar-Array ;) MS brauchte halt eine einfache Möglichkeit Arrays zu übergegben :roll:

...:cat:...

jbg 28. Mär 2005 18:33

Re: StrLen() vs. Length()
 
Zitat:

Zitat von Mephistopheles
Code:
LPSTR pc;

while(lstrlen(pc))
  pc++;

Und geht das ist richtig?

Annahme: pc = "Und\0Los\0\0"

lstrlen(pc) == 3 => while(true)
pc++ => pc == "nd\0Los\0\0"
lstrlen(pc) == 2 => while(true)
pc++ => pc == "d\0Los\0\0"
lstrlen(pc) == 1 => while(true)
pc++ => pc == "\0Los\0\0"
lstrlen(pc) == 0 => while(false) => Ende.

Sollte pc nicht als Array von LPSTR deklariert sein?

Code:
LPSTR *pc;

while(lstrlen(*pc))
  pc++;

Oder habe ich da einen Denkfehler? Dann aber begründen.

derpepe 28. Mär 2005 18:37

Re: StrLen() vs. Length()
 
Zitat:

Zitat von Mephistopheles
Schlimm genug, daß dieser Unterschied zwischen PChar und String nicht Allgemeinwissen eines Delphiprogrammierers zu sein scheint.

Der Unterschied zwischen PChar und String ist klar. V.a. da ich auch ab und an was in C++ schreib(en muss).

Allerdings ist mir nicht klar wie Borland (oder wer auch immer) auf das von mir oben genannte Beispiel kommt....

Mephistopheles 28. Mär 2005 19:23

Re: StrLen() vs. Length()
 
Zitat:

Zitat von jbg
Sollte pc nicht als Array von LPSTR deklariert sein?

Nein, das nicht. Aber du hast recht, daß statt ++ wohl eher ein += lstrlen(pc) + 1 stehen sollte ;)

@derpepe: Der Kommentar war allgemein dahingesagt. Ich gehe davon aus, daß Borland dies benutzt, um 1. StrLen() zu demonstrieren (und da will man eben keine komplizierten Sachen nehmen, die vom Thema ablenken) und
2. EDITs sowieso immer nullterminierten Text enthalten und also das Beispiel nicht unlogisch wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz