Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Char Vergleich: #0 <> '' (https://www.delphipraxis.net/94204-char-vergleich-0-a.html)

MasterEvil 18. Jun 2007 09:22


Char Vergleich: #0 <> ''
 
Hallo,

mal wieder ein Problem beim Umstieg von Delphi 6 auf Delphi 2007.
Habe eine Fremdkomponente, die an mehreren Stellen einen Char auf #0 setzt.
An einer anderen Stelle, wird nun abgefragt, ob der Char='' ist.

In Delphi 6 ist '' und #0 das Selbe und in Delphi 2007 nicht.
Eine If-Abfrage auf Gleichheit schlägt also fehl.

Wisst ihr da genaueres? Kann man das einstellen?

Gruß,
Steffen

SirThornberry 18. Jun 2007 09:26

Re: Char Vergleich: #0 <> ''
 
handelt es sich um ein Stringverarbeitung? bei PChar's markiert #0 das Ende der Zeichenkette, bei Strings ist dem nicht so. Wenn das unter d6 noch so war wurde es zeit das es gefixt wird. Bei Strings wird die Länge über SetLength gesetzt.

Ohne den Quelltext kann jedoch nur spekuliert werden ob es sich bei deinem Char um ein Zeichen eines Strings handelt, um ein Zeichen eines PChars um das Zeichen eines Array of Char etc.

Auf jeden Fall ist #0 <> ''

CCRDude 18. Jun 2007 09:27

Re: Char Vergleich: #0 <> ''
 
Bist Du Dir sicher, daß das in D6 dasselbe ist? General dürfte es erstmal auf keinen Fall dasselbe sein, wenn dann nur in einem speziellen Kontext, aber egal... als Lösung würde mir spontan einfallen, Trim(Text)='' zu prüfen, imho dürfte Trim das #0 zu einem '' umwandeln (bzw. aus #0 = leerer String + #0 das #0 wegschneiden ;) )...

mkinzler 18. Jun 2007 09:28

Re: Char Vergleich: #0 <> ''
 
#0 ist nicht ''.
#0 bedeutet End-Of-String

MasterEvil 18. Jun 2007 09:37

Re: Char Vergleich: #0 <> ''
 
Ich bin mir definitiv sicher, dass es in Delphi 6 so ist.

Es ist allerdings ein WideChar und kein AnsiChar.
Beispiel:
Delphi-Quellcode:
var
 LastChar: WideChar;
begin
  LastChar:=#0;
  if LastChar='' then
  begin
    ShowMessage('Gleich');
  end;
In Delphi 6 zeigt er die Message an, in Delphi 2007 nicht.

Das Problem ist, dass wir nicht wissen, wo überall so ein Vergleich stattfindet.
Allein die Fremdkomponente sind viele tausend Zeilen Code und das ist ja nicht mit Suchen & Ersetzen getan. Der Compiler meckert ja auch nicht und wir merken den Fehler eventuell erstmal gar nicht.

Hatte gehofft, dass es da für Backwards-Kompatibilität eine Einstellung oder einen Compiler-Switch gibt.

Gruß,
Steffen

CCRDude 18. Jun 2007 09:42

Re: Char Vergleich: #0 <> ''
 
@mkinzler: Doch! (re 1. Aussage) bzw. Nein! (re 2. Aussage)

Delphi-Quellcode:
String('')=PChar(#0)
Ist durchaus wahr (haut selbst in Turbo Delphi noch hin)... nur beide auf einen Typ gecastet sind sie nicht identisch ;-)

Und selbst in PChars ist #0 oft genug nicht "End-Of-String", etwa in PWideChar, wo es bei lateinischer Schrift jedes zweite Byte ausmacht, oder in Enumerationen, auch ANSI, wo es ein normaler Trenner ist und der String bis zum #0#0 geht.

mkinzler 18. Jun 2007 09:43

Re: Char Vergleich: #0 <> ''
 
Wenn Fremdkomponenten eine solche falsche Abfrage verwenden und dies bei einer spezifischen Delphiversion zufällig das richtige Ergebnis liefert, darfst du nicht verlangen, daß neuere Delphiversionen das selbe falsche Verhalten an den Tag legen.
Es scheint so als ob die Zuweisung
Delphi-Quellcode:
LastChar:=#0;
ignoriert wird, und deshalb LastChar leer bleibt.

CCRDude 18. Jun 2007 09:46

Re: Char Vergleich: #0 <> ''
 
Tschuldigung, hatte das Beispiel übersehen. Als Workaround folgendes Typecasting verwenden (/in die Komponente einbauen, wo auch immer das halt vorkommt):

Delphi-Quellcode:
var
LastChar: WideChar;
begin
  LastChar:=#0;
  if PWideChar(LastChar)='' then
  begin
    ShowMessage('Gleich');
  end;

Robert Marquardt 18. Jun 2007 09:50

Re: Char Vergleich: #0 <> ''
 
Was hier zuschlaegt sind automatische Konversionen. #0 ist vom Typ Char. Die Zuweisung an einen WideChar bewirkt eine automatische Typkonversion.
Entsprechendes gilt fuer den Vergleich #0 = ''. Da es ein Vergleich zwischen Char und string ist, wird eine Seite automatisch konvertiert. Egal ob der Char zum Leerstring konvertiert wird oder '' als "leeres" Stringendezeichen interpretiert wird, der Vergleich sollte gelingen. Hier kommt ein Problem von Pascal zum Vorschein. 'x' kann je nach Kontext Char- oder String-Literal sein.
Ich glaube D2007 macht hier einen Fehler.

MasterEvil 18. Jun 2007 10:17

Re: Char Vergleich: #0 <> ''
 
Hab es gerad mal mit anderen Delphi Versionen getestet.

Delphi 6, Delphi 7 und Delphi 2005 zeigen die Message alle an.
Delphi 2006 und 2007 nicht mehr.
In Delphi 2005 .NET geht es ebenfalls nicht.

Was Robert sagt, klingt für mich einleuchtend.
Machen diese Sachen nicht die Codepages (Codeseiten)?
Die kann man ja nun irgendwie einstellen. Ist aber bei mir nur Standard auswählbar.

Gruß,
Steffen

Robert Marquardt 18. Jun 2007 10:31

Re: Char Vergleich: #0 <> ''
 
Delphi-Quellcode:
  if #0 = '' then
    ShowMessage('gleich')
  else
    ShowMessage('ungleich');
Dieser Code hat nur einen Breakpoint auf der "ungleich"-Zeile. Der Compiler hat also den if-Teil wegoptimiert. Das gilt fuer D6 und Turbo.
Delphi-Quellcode:
var
  a: Char;
begin
  a := #0;
  if a = '' then
    ShowMessage('gleich')
  else
    ShowMessage('ungleich');
Dieser Code gibt fuer D6 und Turbo hingegen "gleich" aus.
das sieht nach einem echten Compilerfehler aus.

Hawkeye219 18. Jun 2007 10:34

Re: Char Vergleich: #0 <> ''
 
Hallo,

folgendes findet man in der Datei "readme_upd2.htm":

Zitat:

Zitat von Borland Developer Studio 2006, Update 2 Release-Hinweise
Das Kompatibilitätsverhalten von TWideChar/String hat sich in Borland Developer Studio 2006 geändert. Unter Borland Developer Studio 2005 und früher ergab folgende Funktion TRUE. Nun ergibt sie FALSE.

Code:
function DoIt: Boolean;
var
  C: WideChar;
begin
   C := #0;
   if C = '' then
      Result := TRUE
  else
     Result := FALSE;
end;
Dieses Verhalten ist mit dem Verhalten des .NET-Compilers konsistent, könnte sich aber auf bestehenden Code auswirken.

Bei AnsiChar in Win32 gibt es ein ähnliches Verhalten, dass aber noch nicht geändert wurde, so dass es immer noch TRUE ergibt.

Es gibt auch einen zugehörigen Eintrag bei Quality Central.

Gruß Hawkeye

MasterEvil 19. Jun 2007 15:16

Re: Char Vergleich: #0 <> ''
 
Danke! Das beschreibt das Problem.

Im QC Report steht auch genau unser Problem drin:
Zitat:

Normally, I would consider this issue a corner case, however, at least one third party library (XML Partner from Turbo Power) has encountered this change.
Das XML Partner hat uns zu schaffen gemacht. Haben jetzt einfach alle Stellen die wir gefunden haben umgeändert.

Gruß,
Steffen


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:46 Uhr.

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