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;