Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zugriffsverletzung (https://www.delphipraxis.net/189808-zugriffsverletzung.html)

schand99 27. Jul 2016 08:05

AW: Zugriffsverletzung
 
Rätsel gelöst, ich hatte immer die DLL in Verdacht, da Anfangs in einer Funktion am
Delphi-Quellcode:
End;
der Fehler ausgelöst wurde. Durch Umbau von mehreren Berechnungsfunktionen welche Berechnungen aus der DLL benötigten, habe ich dann entdeckt, dass die Freigabe von dynamischen Array's am Ende einer Funktion die Ursache für die Schutzverletzung war. Diese Freigabe erfolgt normalerweise automatisch am
Delphi-Quellcode:
End;
durch manuelles SetLenght(Variable, 0) konnte ich das Problem genauer einkreisen. Zwei dynamische Array's waren noch ok, ab dem dritten gibt es die Schutzverletzung. Ich verstehe zwar nicht warum das so ist, habe zur Zeit aber nicht die Geduld dem auf den Grund zu gehen. Umstellen auf statische Array's war die Lösung.

Tut mir leid dass einige von Euch über meine (falsche) Vermutung zur Fehlerquelle gegrübelt haben,

Gruß
Andreas

Neutral General 27. Jul 2016 08:09

AW: Zugriffsverletzung
 
Bin mir ziemlich sicher, dass es nicht an der Tatsache lag dass du dynamische Arrays benutzt hast.
Garantiert hast du irgendwo über die Grenzen einer deiner dyn. Arrays geschrieben (oder unter die Grenzen).

Dass es mit statischen Arrays geht ist vielleicht nur Zufall oder du hast "aus Versehen" eine Größe gewählt die deinen Fehler "verschwinden" lässt.
(Das heißt nicht, dass er weg ist!)

p80286 27. Jul 2016 10:14

AW: Zugriffsverletzung
 
Zitat:

Zitat von Neutral General (Beitrag 1343535)
Bin mir ziemlich sicher, dass es nicht an der Tatsache lag dass du dynamische Arrays benutzt hast.
Garantiert hast du irgendwo über die Grenzen einer deiner dyn. Arrays geschrieben (oder unter die Grenzen).

Dass es mit statischen Arrays geht ist vielleicht nur Zufall oder du hast "aus Versehen" eine Größe gewählt die deinen Fehler "verschwinden" lässt.
(Das heißt nicht, dass er weg ist!)

Das ist aber sehr diplomatisch.

Gruß
K-H

schand99 27. Jul 2016 12:05

AW: Zugriffsverletzung
 
Sehr diplomatisch?

Die Situation ist etwas verzwickt. Ich habe einen etwas älteren Quellcode einer VB6 Anwendung und muss den "übersetzen". VB6 ist sehr fehlertolerant, das ist nicht unbedingt hilfreich.
Eine Serie von 11(!!) dynamischen Array's wird verwendet um thermo- und physikalische Eigenschaften eines Kältemittels zu berechnen

also
Delphi-Quellcode:
Var
 Variable1, Variable2, Variable3, Variable4, Variable5: Array of Double;

Begin
...
...
  SetLength(Variable1, X)
  SetLength(Variable2, X)
  ...
  ...
  ' ein paar Schleifen...

  SetLength(Variable1, 0)
  SetLength(Variable2, 0)
  SetLength(Variable3, 0)  

End;
die Variable X ist immer kleiner gleich 20, das ist nicht groß. Es wäre allerdings möglich, dass irgend ein Wert eines Array's nicht gesetzt wird (fällt mir jetzt ein, das kann ich ggf. ausprobieren)

Neutral General 27. Jul 2016 12:13

AW: Zugriffsverletzung
 
Die Schleifen wo die Arrays gefüllt werden, wären wichtiger

schand99 27. Jul 2016 16:29

AW: Zugriffsverletzung
 
Jetzt hab ich mir mal einen kleinen Spaß gemacht:

Delphi-Quellcode:
Function WasSolldas(Irgendwas: String): Double;
  Var
  J, M: Integer;
  BogNr, xBog, xTube, beta, Hbeta, eps, Heps, MDich, ZetaBogKM, DPBog, DpDlzphM: array of Double;
begin
   M := 8;
   SetLength(BogNr, M);
   SetLength(xBog, M);
   SetLength(xTube, M);
   SetLength(beta, M);
   SetLength(Hbeta, M);
   SetLength(eps, M);
   SetLength(Heps, M);
   SetLength(MDich, M);
   SetLength(ZetaBogKM, M);
   SetLength(DPBog, M);
   SetLength(DpDlzphM, M);

   for J := 0 to M do
      begin
         BogNr[J] := 0;
         xBog[J] := 0;
         xTube[J] := 0;
         beta[J] := 0;
         Hbeta[J] := 0;
         eps[J] := 0;
         Heps[J] := 0;
         MDich[J] := 0;
         ZetaBogKM[J] := 0;
         DpBog[J] := 0;
         DpDlzphM[J] := 0;
      end;

   SetLength(BogNr, 0);
   SetLength(xBog, 0);
   SetLength(xTube, 0);
   SetLength(beta, 0);
   SetLength(Hbeta, 0);
   SetLength(eps, 0);
   SetLength(Heps, 0);
   SetLength(MDich, 0);
   SetLength(ZetaBogKM, 0);
   SetLength(DPBog, 0);
   SetLength(DpDlzphM, 0);
   Result := 0;
End;
Resultat: das Programm steigt bei SetLenght(xBog, 0); mit Schutzverletzung aus.

Delphi 10.1 Berlin

Was mach ich da falsch?

Neutral General 27. Jul 2016 16:30

AW: Zugriffsverletzung
 
Jupp, genau das.
Ein M-Langes Array hat Indices von 0 bis M-1.
Das hast du bei deiner for-Schleife nicht beachtet, deswegen schreibst du in unreservierten Speicher und das kracht früher oder später.

schand99 27. Jul 2016 17:56

AW: Zugriffsverletzung
 
Oh Mann, du hast recht. Wie peinlich.
Den Thread bitte schließen.
Oder Löschen, das wär für mich noch besser :oops:

p80286 27. Jul 2016 18:01

AW: Zugriffsverletzung
 
Zitat:

Zitat von Neutral General (Beitrag 1343599)
Jupp, genau das.
Ein M-Langes Array hat Indices von 0 bis M-1.
Das hast du bei deiner for-Schleife nicht beachtet, deswegen schreibst du in unreservierten Speicher und das kracht früher oder später.

:thumb:
Zitat:

Zitat von schand99 (Beitrag 1343619)
Oh Mann, du hast recht. Wie peinlich.
Den Thread bitte schließen.
Oder Löschen, das wär für mich noch besser :oops:

Du bist nicht der Erste und wahrscheinlich auch nicht der letzte dem das passiert,
darum wäre es schön blöd den Thread zu löschen.

Gruß
K-H

Neutral General 27. Jul 2016 23:02

AW: Zugriffsverletzung
 
Zitat:

Zitat von schand99 (Beitrag 1343619)
Oh Mann, du hast recht. Wie peinlich.
Den Thread bitte schließen.
Oder Löschen, das wär für mich noch besser :oops:

Ich hab schon viel peinlichere Threads aufgemacht, die mittlerweile hoffentlich gelöscht (Klatsch&Tratsch) oder vergessen sind :mrgreen: Mach dir nichts draus ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz