Hallo,
ich habe ein seltsames Problem. Ich habe eine Software zur Ergebniserstellung für Motorsportveranstaltungen geschrieben. Da hat man je nachdem, wie weit die Veranstaltung fortgeschritten ist, unterschiedlich große Datenmengen.
Um das mal etwas formal zu beschreiben (nur so kann ich präzise sein):
Zu einem Zeitpunkt t haben wir eine Datenmenge d (als Array), zu einem späteren Zeitpunkt t2 haben wir die Datenmenge d2, wobei d eine Teilmenge von d2 ist (d.h. d ist quasi der Anfang von d2).
Nun werden im Zuge der Ergebniserstellung erstmal alle Daten in einem Array a1 gespeichert und dann nach Kriterien umverteilt in andere Arrays (a2, a3,...). Kommen wir zum Punkt: Im Zuge dessen werden Elemente aus a1 wieder gelöscht. Das passiert mit folgender Funktion:
Delphi-Quellcode:
procedure delete_arr_item(var arr : ta_daten; index : integer); overload;
var x : integer;
begin
for x := index + 1 to high(arr) do
arr[x-1] := arr[x];
SetLength(arr, Length(arr)-1);
end;
ta_daten ist ein record, der im wesentlichen Strings, Integers und Bytes enthält. Keine Objekte, keine Pointer (abgesehen von den Strings).
Unter Windows (XP) funktioniert diese Funktion immer. Unter Wine hatte ich das Problem, das das SetLength unter Wine bei bestimmten Datenmengen d eine "Ungültige Zeigeroperation" wirft, bei einer größeren Datenmenge d2, die d enthält, nicht.
Meine Lösung des Problems:
ersetze SetLength(arr, Length(arr)-1) durch arr := copy(arr, 0, high(arr)).
So geht's unter Wine.
Kennt jemand ein ähnliches Problem und hat eine Begründung, warum das unter Wine manchmal Probleme macht?
Falls ihr noch genauere Erläuterungen braucht, kein Problem, fragt einfach.
Gruß
Michael