Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EAccessViolation bei Array of TPoint (https://www.delphipraxis.net/153021-eaccessviolation-bei-array-tpoint.html)

404 Deleded 17. Jul 2010 16:43

Delphi-Version: 2007

EAccessViolation bei Array of TPoint
 
Ich habe bei einem Programm folgendes Problem:
Die Mainform ruft eine andere Form auf
Die Zweite Form schreibt eine Cursorposition in einen als public definierten Array of TPoint
Doch immer wenn das Programm auf den Array zugreifen will, kommt nur folgendes:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00459E74 in Modul 'Project1.exe'. Schreiben von Adresse 00000008'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------

rollstuhlfahrer 17. Jul 2010 16:49

AW: EAccessViolation bei Array of TPoint
 
Hast du mal mit Length() überprüft, ob die Position, an die du schreiben willst, auch existiert?

EDIT: Ansonsten mal die Bereichsprüfung in den Projektoptionen aktivieren.

Bernhard

404 Deleded 17. Jul 2010 17:03

AW: EAccessViolation bei Array of TPoint
 
wie kann ich den array dynamisch machen, damit ich nicht erst überprüfen muss, ob der bereich existiert?

rollstuhlfahrer 17. Jul 2010 17:25

AW: EAccessViolation bei Array of TPoint
 
Darum ging es mir nicht. Ich tippe darauf, dass du auf ein nicht existierendes Element des Array zugreifen willst. Dies endet typischerweise mit einer AV. Wenn du ein statisches Array hast (array[Start..Ende] of Typ) dann hast du deine festen Elemente und kannst auch nur auf diese zugreifen. Wenn du ein dynamisches Array nimmst (array of Typ) dann hat das Array von Anfang an 0 Elemente und du musst erst mit Hilfe von SetLength() das Array aufspannen. Wenn du eine Liste haben willst, ist es einfacher, die Klasse TList zu vergewaltigen als einem Array beizubringen, selbständig zu wachsen. (Wenn du nur willst, dass das Array wächst und nicht zwischendrin Elemente rausnehmen willst, ist es mit SetLength() doch einfacher).
Mit Hilfe von ShowMessage(IntToStr(Length(DeinArray))); kannst du auslesen, wie viele Elemente das Array hat und du kannst berechnen, auf welches du zugreifen willst (Achtung: dynamische Arrays fangen mit Index = 0 an!). Wenn der berechnete Wert größer ist als die Anzahl der Elemente - 1 (für das 0. Element), dann greifst du ins Leere und der Computer mag das gar nicht.

Bernhard

himitsu 17. Jul 2010 18:22

AW: EAccessViolation bei Array of TPoint
 
Wie wäre es, wenn man einfach mal die Bereichsprüfung in den Projektoptionen aktiviert und so schaut ob's wirklich am Index liegt?

PS: Genau deswegen wäre es mir lieb, wenn in Delphi sowas standardmäßig aktiviert wäre.

404 Deleded 17. Jul 2010 18:40

AW: EAccessViolation bei Array of TPoint
 
Hallo,
danke für die schnellen Antworten.
Die Bereichsprüfung hat nichts gebracht.
Ich habe inzwischen den Array zu einem Statischen Array gemacht.
Kann man mit SetLength() auch mit einer bestimmten angabe einfach eines dranhängen?

Mit einem Statischen Array funktioniert es. Habe einfach den minimal/maximal Wert auf 1-100 gestellt und den stat. Array auf [0..101]. Damit kann es eig. keine Probleme geben, oder?

himitsu 17. Jul 2010 18:48

AW: EAccessViolation bei Array of TPoint
 
Zitat:

Zitat von 404 Deleded (Beitrag 1035881)
Kann man mit SetLength() auch mit einer bestimmten angabe einfach eines dranhängen?

Delphi-Referenz durchsuchenLength + etwas Mathe + Delphi-Referenz durchsuchenSetLength ?

rollstuhlfahrer 18. Jul 2010 18:16

AW: EAccessViolation bei Array of TPoint
 
Zitat:

Zitat von 404 Deleded (Beitrag 1035881)
Habe einfach den minimal/maximal Wert auf 1-100 gestellt und den stat. Array auf [0..101].

Wo wir schon bei Mathematik sind: 1-100 sind 100 Elemente, 0-101 sind 102 Elemente. Wenn du das Array schon statisch machst, dann brauchst du nicht wie bei Aufnahmen aus dem Fernsehen einen Vor- und Nachlauf. Das ist nur unnötig vergeudeter Arbeitsspeicher.

Zitat:

Zitat von 404 Deleded (Beitrag 1035881)
Kann man mit SetLength() auch mit einer bestimmten angabe einfach eines dranhängen?

Wenn du ein statisches Array meinst, dann nein. Statisch ist statisch und nun nicht mal einfach eben so hier mal dynamisch.

Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr.

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