![]() |
Zugriffverletzung beim Procedure Aufruf
Moin,
Kann mir jemand sagen woher es kommt das Delphi bei den Aufruf zwei meiner Proceduren eine zugriffverletung bekommt, auch wenn ich sie Minimaliesiere und KEINE Parameteruebergabe mache, und nur eine Showmessage ausgebe. die Proceduren werden uebrigens vom Hauptformular aufgerufen, und liegen selber in einer UNIT. vielen Dank FGB |
Re: Zugriffverletzung beim Procedure Aufruf
Zitat:
Cu, Frank |
Re: Zugriffverletzung beim Procedure Aufruf
:stupid: Ja, der Vorredner hat sicherlich recht.
Zeig uns doch mal den Code einer der Prozeduren. Cu, Udontknow |
Re: Zugriffverletzung beim Procedure Aufruf
Scheint doch an einen Parameter zuliegen und zwar an ein Record das im Hauptformular Global ist und sich sonst auch immer an anderen Procedure Funktionen uebergeben laesst.
Und ich bekomme die Zugriffsverletzung schon beim begin und ich vermute er mag TProjekte nicht.
Delphi-Quellcode:
procedure auswertung_dat_init(Anzahl: TGroesse; Projekte: TProjekte;
var Auswertung: TAuswertungDat); var i: Integer; // Durchlauf Projekt erstemal j: Integer; // Durchlauf Projekt zweitesmal y: Integer; // Durchlauf Projekt drittesmal begin // Setzte die Anzahl der Projekte // in der Auswertung. try //setLength(Auswertung, Anzahl); except on EOutOfMemory do Showmessage('Nicht Genuegend Speicher fuer die Auswertung Vorhanden.'); end; {for i := 0 to Anzahl - 1 do begin setLength(Auswertung[i], Projekte[i].AnzDateien); for j := 0 to Projekte[i].AnzDateien - 1 do begin setLength(Auswertung[i][j], Anzahl); for y := 0 to Anzahl - 1 do begin setLength(Auswertung[i][j][y], Projekte[y].AnzDateien); end; end; end; } end; |
Re: Zugriffverletzung beim Procedure Aufruf
Keine Ahnung, was jetzt TGroesse und TProjekte so ist, aber ich würde mal probieren ein "const" vor die beiden Parameter zu setzen.
|
Re: Zugriffverletzung beim Procedure Aufruf
Hat geklappt aber wieso?
Delphi-Quellcode:
TGroesse = 0..100;
TInfo = Record Nr : Word; Kopf : String[30]; Inhalt: String; End; TUnterprogramme = array[TAnzUnterprogramme] of TInfo; TProgramme = Record Unterprogramme: TUnterprogramme; Anzahl: TAnzUnterprogramme; End; TDatei = Record Name : String[100]; Inhalt : String; Typ : TTyp; Nr : Word; Programname : String; Interfaceteil : String; Implementations : String; Hauptteil : String; Unterprogramme: TProgramme; End; TDateien = array[TGroesse] of TDatei; TInfos = array[TGroesse] of TInfo; TProjekt = Record Ordner : String[100]; //Entwerder Ordnername oder Dateiname AnzDateien: TGroesse; Dateien : TDateien; End; // Projekte Dateien Unterprogramme TProjekte = array[TGroesse] of TProjekt; |
Re: Zugriffverletzung beim Procedure Aufruf
Hallo,
solange dieser Record nicht als File Of Record gespeichert werden soll, würde ich erst mal das String[x] durch ein normales String ersetzen, schon um Speicherplatz zu sparen. Ausserdem nimmt man TList für solche Sachen, sonst bist du ja begrenzt auf 100 (TGroesse). Wo wir dort gerade sind ;) TGroesse -> const C_MaxRecords klingt schöner. Dieses AnzDateien: TGroesse; also AnzDateien: 0..100 sieht mir auch sehr merkwürdig aus. Sicher das ein var vor den beiden letzten Parametern und komplett nichts bringt? Ich würde aber trotzdem erst mal alle Records in Klassen umformen, und dann Listen (TList) verwenden. Wenn du eine beliebige Menge Einträgen erlauben willst, musst das das später eh machen. Oder du nimmst dynamische Arrays, du mag ich aber nicht so. Heiko |
Re: Zugriffverletzung beim Procedure Aufruf
Zitat:
Zitat:
Zitat:
Zitat:
vielen vielen Dank |
Re: Zugriffverletzung beim Procedure Aufruf
Hallo,
ohne var oder const wird bei records die ganze Struktur auf den Stack abgelegt (kopiert), call by value, wie es so schön heisst. Das ist erstens zeitaufwändig und zweitens hier sinnlos. Mit var oder const wird nur ein Zeiger auf dem Stack angelegt. Mit TList wird immer nur der Speicher belegt, der aktuell benötigt wird, also bei 2 Projekten nur der Speicher für 2 Porjekte. Ausserdem kann die Anzahl der Projekte oder Dateien beliebig gross werden (naja 2 Mrd. ...) Heiko |
Re: Zugriffverletzung beim Procedure Aufruf
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz