Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi s:string, s[i] <> string[1] ?! (https://www.delphipraxis.net/157235-s-string-s%5Bi%5D-string%5B1%5D.html)

ThYpHoOn 4. Jan 2011 14:56


s:string, s[i] <> string[1] ?!
 
Bin (immer noch) dabei eine Scripter-Library von D5 auf Delphi XE zu portieren und nach gefühlten 1000 Char und PChar umwandlungen auf Ansi/Wide und vielen weiteren spaßigen Sachen bin ich auf folgendes gestoßen:

Code:
procedure TCustomxyz.FToggleStrCase(var S : string);
var
  i  : integer;
  len : integer;
  a  : string[1];
  b  : string[1];
begin
  len := Length(S);
  i := 1;
  while i <= len do
  begin
    {...}
    b := S[i];
    a := AnsiUpperCase(b);
    if a = b then
      S[i] := AnsiLowerCase(b)[1]
    else
      S[i] := a[1];
    inc(i);
  end;
end;
Der Code sieht nun eigentlich recht unspektakulär aus, aber der Compiler meckert nun bei dem letzten else ("S[i] := a[1];") dort sieht er S[i] als Char und a[1] als AnsiChar.
Schauen wir uns deren Deklaration mal genauer an:
S ist ein String, a ist auch ein String, allerdings als String[1] deklariert. WTF?! Der kastet also automatisch ein String[1] als Ansi und ein String als normalen (Unicode) Char.
Sehe ich das so richtig? Das verwirrt mich doch jetzt ein wenig...

Klaus01 4. Jan 2011 14:58

AW: s:string, s[i] <> string[1] ?!
 
.. ein String in Delphi >= 2009 ist ein UnicodeString
Mach daraus einen AnsiString dann wird auch S[i] ein AnsiChar sein.

Nachtrag:
Delphi-Quellcode:
procedure TCustomxyz.FToggleStrCase(var S : AnsiString);
var
  i : integer;
  len : integer;
  //a : string[1];
  //b : string[1];
  a : AnsiChar;
  b : AnsiChar;
begin
  len := Length(S);
  i := 1;
  while i <= len do
  begin
    {...}
    b := S[i];
    a := AnsiUpperCase(b);
    if a = b then
      S[i] := AnsiLowerCase(b)[1]
    else
      S[i] := a[1];
    inc(i);
  end;
end;
Grüße
Klaus

Neutral General 4. Jan 2011 14:59

AW: s:string, s[i] <> string[1] ?!
 
Hallo,

Ja das war anfangs auch etwas verwirrend für mich. ShortStrings (d.h. auch Variablen vom Typ String[n]) sind AnsiStrings. Ist leider sehr irreführend. "Wide-ShortStrings" gibt es also quasi gar nicht.

@Klaus01: Es ist ja gerade genau anders rum ;-) String[1] = AnsiChar

ThYpHoOn 4. Jan 2011 15:10

AW: s:string, s[i] <> string[1] ?!
 
Zitat:

Zitat von Neutral General (Beitrag 1072197)
Hallo,

Ja das war anfangs auch etwas verwirrend für mich. ShortStrings (d.h. auch Variablen vom Typ String[n]) sind AnsiStrings. Ist leider sehr irreführend. "Wide-ShortStrings" gibt es also quasi gar nicht.

@Klaus01: Es ist ja gerade genau anders rum ;-) String[1] = AnsiChar

Jop, das hat mich so ein wenig verwirrt warum er String[1] als Ansi nimmt obwohl Delphi doch eigentlich dann nur Unicode's nutzt. "Wide-ShortStrigns" hört sich aber auch sehr nett an :)

himitsu 4. Jan 2011 16:25

AW: s:string, s[i] <> string[1] ?!
 
String[...] ist ein Delphi-Referenz durchsuchenShortString und hat absolut nichts mit dem Delphi-Referenz durchsuchenString (Delphi-Referenz durchsuchenAnsiString, Delphi-Referenz durchsuchenWideString oder Delphi-Referenz durchsuchenUnicodeString) zu tun.

Ein ShortString ist nunmal nur ANSI und daran hat sich selbst in D2009+ nicht geändert.

PS: Einen String zu nehmen, wo doch eh nur ein Char benötigt wurde, war eh nicht das Wahre.



Delphi-Quellcode:
procedure TCustomxyz.FToggleStrCase(var S : String);
var
  i : Integer;
  a, b : String;
begin
  for i := 1 to Length(S) do
  begin
    b := S[i];
    a := AnsiUpperCase(S[i])[1];
    if a = b then
      S[i] := AnsiLowerCase(b)[1]
    else
      S[i] := a;
  end;
end;
wobei es so wesentlich optimaler arbeiten würde
Delphi-Quellcode:
procedure TCustomxyz.FToggleStrCase(var S : String);
var
  i : Integer;
  U, L : Char;
begin
  U := AnsiUpperCase(S);
  L := AnsiLowerCase(S);
  for i := 1 to Length(S) do
    if S[i] = U[i] then
      S[i] := L[i]
    else
      S[i] := U[i];
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 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