aList[i,j] := Blist [u,v];
Ist ja im Endeffekt nur eine einfache Integerzuweisung und macht keine Probleme.
Ihr könnt aber dennoch mal, in den Projektoptionen, die Bereichsprüfung aktivieren, denn Schreibzugriffe auf nichtexistierende Fehler bereiten manchmal kleine Problemchen.
Aber
aList := bList;
oder
aList[i] := bList[u];
sind da etwas anders zu betrachten, denn dyn. Arrays verfügen zwar über eine Referenzzählung, aber man hat "vergessen" diesen Arrays einen CopyOnWrite-Zugriff zu verpassen.
Wenn man bei Strings
Delphi-Quellcode:
var
s, x: string;
s := '12345';
x := s; // erhöht nur die Referenzzählung
x[3] := 'a'; // führt vorher ein UniqueString auf x aus, bevor geschrieben wird.
ShowMessage(s + sLineBreak + x);
Delphi-Quellcode:
var
s, x: array of Integer;
SetLength(s, 5);
s[0] := 1;
s[1] := 2;
s[2] := 3;
s[3] := 4;
s[4] := 5;
x := s; // erhöht auch nur die Referenzzählung
x[2] := 666; // schreibt einfach, ohne die Referenzzählung zu prüfen
ShowMessage(IntToStr(s[2]) + ' ' + IntToStr(x[2]));
Delphi-Quellcode:
...
s[4] := 5;
x := Copy(s); // kopiert das array, in eine eigenständige Instanz
x[2] := 666; // schreibt einfach, ohne die Referenzzählung zu prüfen
ShowMessage(IntToStr(s[2]) + ' ' + IntToStr(x[2]));
Delphi-Quellcode:
...
s[4] := 5;
x := s; // erhöht auch nur die Referenzzählung
x := Copy(x); // sicherstellen, daß x unique ist (zur Optimierung könnte man vorher noch die referenzzählung prüfen, ob überhaupt nötig)
x[2] := 666; // schreiben (die Referenzzälung wurde ja schon sichergestellt)
ShowMessage(IntToStr(s[2]) + ' ' + IntToStr(x[2]));
Aber so oder so, an der Referenzzählung sollte nichts kaputtgehn, abgesehn
- von Bufferoverruns
- wenn man die Array-Instanz-Referenzzählung direkt oder indirekt mit Pointern schrottet/umgeht