also ich hatte keine
Exception (war aber bestimmt nur Zufall X'D)
Compiliren läßt es sich schon, denn dabei weiß Delphi ja noch nicht auf welche Char-Indizes zugegriffen wird und wenn (was oftmals der Fall ist) auch noch keine Bereichsprüfung (vom Programmierer oder durch den Compiler) durchgeführt wird, dann wird einfach in die gewünschte Stelle geschrieben.
PS: wenn man den internen Aufbau des AnsiStrings sich mal genauer ansieht, dann ist am Index 0 (den es ja eigentlich nicht gibt) zufällig das höchstwertigste Byte der Stringlängenangabe welche einen Integer darstellt.
nach 'ner Zuweisung ergäbe es dann z.B. StrLen := (StrLen and $00ffffff) or (Ord('_') shl 24)
tja und danach hat man dann ja einen rießigen (defekten) String, der bei weiterer Verarbeitung (wofür z.B. 'ne erneute Speicherzuweisung nötig ist) mindestens ebensoviel Speicher wie in StrLen anfordern können wollte, was den fehlenden Arbeitsspeicher (die zugehörige
Exception) erklärt.
schon witzig was solch winzige Fehler (wie 'nen falscher Index) für rießige Auswirkungen haben können
Delphi-Quellcode:
function betonen(vers:string):string;
var z:integer;
begin
result:=vers;
for z:=1 to length(vers) do
begin
if vers[z] in ['a','e','i','o','u'] then
begin
result[z]:='*';
end
else
begin
result[z]:='_';
end;
end;
end;
oder in kurz:
- mit setzen von Result wird ja die Funktion nicht verlassen (wie in anderen Sprachen), weshalb man da auch "mehrmals" drauf zugreifen kann
Delphi-Quellcode:
function betonen(vers:string):string;
var z:integer;
begin
SetLength(Result, Length(vers);
for z:=1 to length(vers) do
if vers[z] in ['a','e','i','o','u'] then
Result[z]:='*';
else
Result[z]:='_';
end;
und genau, laß dir nüschts einreden, denn mit Result statt Funktionname sieht man wesendlich besser daß das ergebnis und kein rekursiver Funktionsaufruf gemeint ist