Einzelnen Beitrag anzeigen

Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#7

AW: Access Violation nach Hinzufügen eines RichEdit

  Alt 17. Jan 2012, 19:15
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
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat