Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: Delphi 2007 - UpperCase(), LowerCase() Implementierung

  Alt 7. Aug 2009, 12:19
Zitat von luke2:
Danke, ich habe es jetzt mal so gemacht:
Delphi-Quellcode:
procedure FastUpperCase(var S: String); //inline;
var
  C: ^Char;
  I,j: Integer;
begin
  C := Addr(S[1]); j:=sizeof(char);
  for I := 0 to Length(S) - 1 do
  begin
    if (C^ >= 'a') and (C^ <= 'z') then C^ := UpCase(C^);
    C := Ptr(Integer(C) + j);
  end;
end;
Da stehen einem ja die Haare zu Berge. Wenn man schon mit Zeigern um sich wirft, dann aber bitte richtig und vor allem ohne S über die Hintertür zu manipulieren und somit andere Strings zu verändern, die zufälligerweise auf den selben Speicherplatz zeigen (Copy-On-Write). Und vor allem sollte man keine konstanten (=read only) Strings beschreiben, da das nur zu Schutzverletzungen führt.

Delphi-Quellcode:
procedure FastUpperCase(var S: String);
var
  P: PChar;
  Len: Integer;
begin
  { Garantieren, dass keine andere String-Referenz auf unseren Speicher
    zeigt (Copy-on-Write) }

  UniqueString(S);

  {$STRINGCHECKS OFF} // grrr... Wir wollen diesen Unsinn nicht, der den Code
  Len := Length(S); // nur aufbläht, verlangsamt und für Delphi und gescheite
  {$STRINGCHECKS ON}  // C++Builder Entwickler keinen Mehrwehrt bringt.
  P := PChar(S);
  for Len := Len downto 1 do
  begin
    case P^ of // Delphi 2009 Workaround für "in ['a'..'z']" Warnung, gleicher Maschinencode
      'a'..'z':
        P^ := Char(Ord(P^) xor $20); // Die Eigenschaften der ASCII-Tabelle ausnutzen
    end;
    Inc(P);
  end;
end;
  Mit Zitat antworten Zitat