AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein String gleich aber doch nicht gleich...
Thema durchsuchen
Ansicht
Themen-Optionen

String gleich aber doch nicht gleich...

Ein Thema von EWeiss · begonnen am 9. Sep 2012 · letzter Beitrag vom 9. Sep 2012
Antwort Antwort
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#1

AW: String gleich aber doch nicht gleich...

  Alt 9. Sep 2012, 19:36
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:
cmp dword ptr [ebp-$04],$00
(An Pointer(String) - 4 liegt der Längenzähler, 4 Bytes)
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...
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: String gleich aber doch nicht gleich...

  Alt 9. Sep 2012, 19:41
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:
cmp dword ptr [ebp-$04],$00
(An Pointer(String) - 4 liegt der Längenzähler, 4 Bytes)
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...
Also dann gibt es die definition nicht "was richtig und was falsch".
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:
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;
Letztendlich ist die rückgabe auch ein string
sizeof(sBuf) - 1);

Da fehlt wohl noch was Knowhow

gruss

Geändert von EWeiss ( 9. Sep 2012 um 19:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.385 Beiträge
 
Delphi 12 Athens
 
#3

AW: String gleich aber doch nicht gleich...

  Alt 9. Sep 2012, 19:44
Da bei einem Leerstring der Stringpointer auf nil steht, kann bei S <> '' direkt auf nil geprüft werden, wärend bei Length(S) <> 0 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) <> '' zu einem S <> '' ? )
(standardmäßig, also solange keiner fahrlässig an der Speicherverwaltung des Strings rumfummelt)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

AW: String gleich aber doch nicht gleich...

  Alt 9. Sep 2012, 19:47
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:
Letztendlich ist die rückgabe auch ein string
sizeof(sBuf) - 1);
Ja ein "String", aber kein AnsiString oder kein UnicodeString etc. -
Und, wie erwähnt, gibt hier SizeOf() ja nicht an, wieviel wirklich drin steht, sondern die Arraygröße in Bytes ...
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)

Geändert von mirage228 ( 9. Sep 2012 um 19:57 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: String gleich aber doch nicht gleich...

  Alt 9. Sep 2012, 19:49
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
Ok dann werde ich das so handhaben..
Wie sieht es denn mit dem editierten Beitrag aus bei prüfung auf buffer länge.

Buffer länge

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.385 Beiträge
 
Delphi 12 Athens
 
#6

AW: String gleich aber doch nicht gleich...

  Alt 9. Sep 2012, 19:54
Bei S > '' muß man auch noch aufpassen, denn '' < S ist ja andersrum, wärend es bei <> egal ist.

Und auch von der Logik her, ist S ungleich leer , bzw. S nicht leer auch verständlicher, als ein S größer als Nichts .
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.485 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: String gleich aber doch nicht gleich...

  Alt 9. Sep 2012, 19:55
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: String gleich aber doch nicht gleich...

  Alt 9. Sep 2012, 20:00
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.
Danke..
Da hab ich wohl ein Thema angestoßen ich denke viel nicht Studierte Schreiber dürften damit probleme haben.


gruss
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:00 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