Ich werde aus meinem Problem einfach nicht schlauer. Das Thread vorher war nicht das gelbe vom Ei, daher hab ich ihn löschen lassen. Ich bin jetzt gerade auf der Suche nach dem eigentlichen Problem und das hat mit der Funktion
System.Copy(), auf ein Array angewendet zu tun. Hier mal der Code, um welches es sich dreht:
Delphi-Quellcode:
TApDynamicArray<T> = record
private const
{...}
private type
{...}
private
{...}
public
{...}
function Clone(const StartIndex, Count: Integer): TArray<T>;
{...}
end;
function TApDynamicArray<T>.Clone(const StartIndex, Count: Integer): TArray<T>;
var
NewArray : TArray<T>;
i : Integer;
begin
// (1)
System.SetLength(NewArray, Self.Length);
for i := 0 to Self.Length - 1 do
NewArray[i] := FData[i];
Result := NewArray;
// ------------------------------------------------
// (2)
// Result := System.Copy(FData, StartIndex, Count);
end;
Die untere Variante wollte ich eigentlich nutzen, da ich denke, dass diese effizienter funktioniert, als das was ich da mache, also als Variante (1). Nun, warum habe ich Variante (1) überhaupt geschrieben und kann (2) nicht nutzen: Wenn ich den Code compiliere und dann ausführe, bekomme ich, wenn ich Variante (2) nutze, eine AccessViolation wenn System.Copy() ausgeführt wird -- allerdings nur unter bestimmten Voraussetzung, aber dazu später mehr:
Code:
Im Projekt Project1.exe ist eine
Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00408278 in Modul 'Project1.exe'. Lesen von Adresse F8C483ED' aufgetreten.
Es drängt sich mir hier die Frage auf, was zum Teufel denn da schief laufen kann? Wo kann es beim Befehl System.Copy() krachen? Habe in der Doku nichts gefunden, ebenso wenig im Netz.
Nun zu der "tollen" Voraussetzung, denn jetzt wird es ganz lustig: unter
public habe ich im Moment gefühlt 70-80 Methoden definiert, später werden es noch ein paar mehr werden. Habe auch ein paar Operatoren überladen und eine Klassenmethode ist vorhanden. Diese Clone-Methode mit dem System.Copy()-Aufruf ist im Moment an Stelle 7 der Methodendeklarationen, die Klassenmethoden bzw. Operatoren mitgerechnet, d.h. ohne diese wäre die Clone-Methode an Stelle 1. Verschiebe ich die Clone-Methode an Stelle 45(!) oder weiter nach unten, dann kann ich den System.Copy()-Aufruf nutzen und auf meinen eigenen Code verzichten. Ist diese also zwischen Position 1 und 45 platziert, erhalte ich oben genannte
Exception. Und jetzt erzählt mir mal warum das so ist
Ich persönlich glaube, dass der Delphi-Compiler hier ein Problem mit was weiß ich auch immer hat und einfach Käse produziert... Aber ich lasse mich echt liebend gerne überaschen...
Anbei findet ihr die Demo, bei der es so toll kracht
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)