![]() |
AW: String gleich aber doch nicht gleich...
Zitat:
Sizeof liefert bei Strings den Wert 4 und bei ShortStrings die Anzahl der maximalen Zeichen + 1 (Längenbyte). Aber in keinem Fall die tatsächliche Länge. Zitat:
Zitat:
|
AW: String gleich aber doch nicht gleich...
Ja gut, es läuft auf (fast) das selbe hinaus.
Bei > '' und <> '' optimiert der Compiler das schon, dass automatisch auf die String-Länge zurückgegriffen wird:
Code:
(An Pointer(String) - 4 liegt der Längenzähler, 4 Bytes)
cmp dword ptr [ebp-$04],$00
Wobei ein Vergleich auf 0, wie er bei <> '' geschieht ("jnz" in ASM), meine ich, schneller ist, als ein Range-Vergleich über "jnbe" in dem Fall... |
AW: String gleich aber doch nicht gleich...
Zitat:
SizeOf gibt bei einem String immer 4 zurück (bei 32 Bit). Bei einem ShortString gibt es die maximale Länge + 1 (dem Längenbyte an Index 0) zurück. |
AW: String gleich aber doch nicht gleich...
Zitat:
Zumindest bei der prüfung >, <> , Length. SizeOf bleibt dann außen vor soviel habe ich verstanden und auch abgeändert. Überlge nun ob das auch nicht richtig ist.
Delphi-Quellcode:
Letztendlich ist die rückgabe auch ein string
function GetWndText(WinHandle: HWND): string;
var sBuf: array[0..256] of char; lRet: Integer; begin Result := ''; lRet := GetWindowText(WinHandle, sBuf, sizeof(sBuf) - 1); if lRet <= 0 then exit; Result := sBuf; end; sizeof(sBuf) - 1); Da fehlt wohl noch was Knowhow ;) gruss |
AW: String gleich aber doch nicht gleich...
Da bei einem Leerstring der Stringpointer auf nil steht, kann bei
Delphi-Quellcode:
direkt auf nil geprüft werden, wärend bei
S <> ''
Delphi-Quellcode:
erstmal auf nil geprüft werden muß, dann wird der Offset zum Längen-Wert aufgerechnet, von dort die Länge geholt und dann das mit 0 verglichen. (oder optimiert Delphi inzwischen das
Length(S) <> 0
Delphi-Quellcode:
zu einem
Length(S) <> ''
Delphi-Quellcode:
? )
S <> ''
(standardmäßig, also solange keiner fahrlässig an der Speicherverwaltung des Strings rumfummelt) |
AW: String gleich aber doch nicht gleich...
Streng genommen nicht, aber ich finde das mit dem größer-als ">" auch etwas seltsam. Kommt mir zumindest beim Lesen von der Semantik komisch vor.
<> '' sagt ganz klipp und klar aus: Dieser String soll nicht leer sein. Bei dem anderen musste erstmal um die Ecke decken ;) Edit: Zitat:
Und, wie erwähnt, gibt hier SizeOf() ja nicht an, wieviel wirklich drin steht, sondern die Arraygröße in Bytes ... |
AW: String gleich aber doch nicht gleich...
Zitat:
Wie sieht es denn mit dem editierten Beitrag aus bei prüfung auf buffer länge. ![]() gruss |
AW: String gleich aber doch nicht gleich...
Zitat:
Delphi-Quellcode:
.
Length(Str)
Delphi-Quellcode:
ist in Delphi einfach das Symbol für Ungleichheit, wie
<>
Delphi-Quellcode:
in C-artigen Sprachen oder ≠ in der Mathematik.
!=
Delphi-Quellcode:
ist hier nicht zu verstehen als „Str ist größer oder kleiner '' “, sondern als „Str ist ungleich '' “, oder man könnte auch sagen: „Str ist kein Leerstring“.
Str <> ''
Ich halte den Vergleich auf
Delphi-Quellcode:
daher für die sauberste Lösung.
''
|
AW: String gleich aber doch nicht gleich...
Bei
Delphi-Quellcode:
muß man auch noch aufpassen, denn
S > ''
Delphi-Quellcode:
ist ja andersrum, wärend es bei
'' < S
Delphi-Quellcode:
egal ist.
<>
Und auch von der Logik her, ist
Delphi-Quellcode:
, bzw.
S ungleich leer
Delphi-Quellcode:
auch verständlicher, als ein
S nicht leer
Delphi-Quellcode:
.
S größer als Nichts
|
AW: String gleich aber doch nicht gleich...
Das SizeOf bei GetWindowText ist falsch. Die Funktion möchte die maximale Anzahl an Zeichen (Char) haben und nicht die Byte-Größe (Quelle MSDN: "The maximum number of characters to copy to the buffer").
Mit SizeOf(Buf) bekommst du ab Delphi 2009 (Unicode) die doppelte Anzahl zurück, da SizeOf(Char) = 2 ist und somit "257*2" zurückkommt. GetWindowText möchte aber nicht die Byte-Größe, sondern die "Anzahl der verfügbaren Zeichen". Und die ermittelt man über Length. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 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 by Thomas Breitkreuz