Hi,
naja, ich war gestern nicht am Rechner... aber jetzt zeig ich was.
Danke für die Antworten inzwischen!
(Leider bekomme ich nach der
Access Violation nur ein CPU-Fenster angezeigt, da erkenne ich leider nicht, was schiefgegangen sein könnte)
Deklaration von TCell:
Delphi-Quellcode:
TCell = class(TObject)
public
entries: Array of TCellEntry; // Zelleinträge
position: TCellReference; // Metrische Position der Zelle
constructor Create; overload;
constructor Create(pX, pY, pZ: Integer); overload;
procedure addToEntries(pMainIndex: Integer; pWayPoints: TIntArray); overload;
procedure addToEntries(pMainIndex: Integer; pWayPoints: Array of Integer); overload;
function transit(pMainIndex, pStepWidth: Integer): Boolean;
end;
Implementierung von addToEntries(), der Methode von TCell innerhalb derer das SetLength schiefgeht:
Delphi-Quellcode:
procedure TCell.addToEntries(pMainIndex: Integer; pWayPoints: TIntArray);
var
len: Integer;
begin
With self do begin
len := Length(entries);
inc(len);
SetLength(self.entries, len); // <<<=== FEHLERPOSITION
entries [len-1] := TCellEntry.Create;
With entries [len-1] do begin
mainIndex := pMainIndex;
setWayPoints(pWayPoints);
end;
end;
end;
Die Funktion, in der die Methode addToEntries()aufgerufen wird, und wobei dann der Fehler auftritt:
Delphi-Quellcode:
function TCell.transit(pMainIndex, pStepWidth: Integer): Boolean;
var
baseList: Array of TCellEntry; // Liste aller Einträge mit Hauptindex = pMainIndex
targetList: TCellReferenceArray; // Liste aller Zellreferenzen, die als Ziel in Frage kommen
i, j, k: Integer;
len: Word;
targetCell: TCell;
targetValid: Boolean;
temp_wayPoints: TIntArray;
begin
result := false; // Bei Abbruch der Funktion an irgendeiner Stelle ist auf jeden Fall (result = false) gegeben
With self do begin
if Length(entries) > 0 then begin // Falls Einträge in der aktuellen Zelle vorhanden sind...
For i:=0 to Length(entries)-1 do begin // Basisliste anlegen...
if entries [i].mainIndex = pMainIndex then begin
len := Length(baseList);
inc(len);
SetLength(baseList, len);
baseList [len-1] := entries [i];
end;
end;
SetLength(targetList, 0);
targetList := calculatePotentialTargets(self.position, pStepWidth); // Liste potentieller Ziele berechnen...
// Einträge in den validen Zielen anlegen...
For i:=0 to Length(baseList)-1 do begin // Für alle Einträge der aktuellen Zelle...
For j:=0 to Length(targetList)-1 do begin // Für alle Ziele... (von der aktuellen Zelle aus)
targetCell := getCellByReference(targetList [j], mainCellArray);
targetValid := true;
For k:=0 to Length(targetCell.entries)-1 do begin // Für alle Einträge der Zielzelle (falls vorhanden) prüfe ob "wir" den geschrieben haben, d.h. ob wir schonmal da waren...
With targetCell.entries [k] do begin
if (mainIndex < pMainIndex) and
(isPrefix(wayPoints, baseList [i].wayPoints)) then begin
targetValid := false;
break;
end;
end;
end;
if targetValid then begin // Wenn das Ziel nicht invalidiert wurde...
temp_wayPoints := baseList [i].getWayPoints;
len := Length(temp_wayPoints);
inc(len);
SetLength(temp_wayPoints, len);
temp_wayPoints [len-1] := j;
targetCell.addToEntries(pMainIndex+1, temp_wayPoints); // <<<=== FEHLERPOSITION
result := true;
end;
end;
end;
end;
end;
end;
Eine möglicherweise sehr wichtige Information ist diese:
In der Methode
TCell.transit() tritt der Fehler bei Aufruf der Methode
targetCell.addToEntries() auf (da wo
FEHLERPOSITION steht).
Interessant ist, dass der Fehler
nicht auftritt, wenn ich das
SetLength aus
targetCell.addToEntries() vor dem Aufruf von
targetCell.addToEntries() quasi "manuell" selber ausführe, in dem ich vorher eine Zeile einfüge, die lautet:
SetLength(targetCell.entries, <Größe>)
In diesem Fall bekomme ich keine
Access Violation bei der Veränderung dieses Arrays - passiert die Veränderung jedoch innerhalb der Methode, so erhalte ich eine Violation.
--> nix verstehen
Wenn Ihr noch mehr Code braucht - kein Problem, is ja nicht geheim. Is halt noch ein bisschen was.
Bin gespannt auf Rückfragen oder Ideen...
Viele Grüße
Caps