Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffverletzung beim Procedure Aufruf (https://www.delphipraxis.net/83648-zugriffverletzung-beim-procedure-aufruf.html)

fgb 5. Jan 2007 11:57


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

dataspider 5. Jan 2007 12:08

Re: Zugriffverletzung beim Procedure Aufruf
 
Zitat:

Zitat von fgb
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

Ich denke, es liegt an Fehlern in deinem Code. :wink:

Cu, Frank

Udontknow 5. Jan 2007 12:16

Re: Zugriffverletzung beim Procedure Aufruf
 
:stupid: Ja, der Vorredner hat sicherlich recht.

Zeig uns doch mal den Code einer der Prozeduren.

Cu,
Udontknow

fgb 5. Jan 2007 12:21

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;

sirius 5. Jan 2007 12:38

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.

fgb 5. Jan 2007 12:42

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;

hoika 5. Jan 2007 12:55

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

fgb 5. Jan 2007 13:17

Re: Zugriffverletzung beim Procedure Aufruf
 
Zitat:

Zitat von hoika
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

Zitat:

TGroesse -> const C_MaxRecords klingt schöner.
Hatte schon eine Konstante fuer die 100 hatte sie nur rausgenommen, um hier den code zuzeigen.
Zitat:

Sicher das ein var vor den beiden letzten Parametern
und komplett nichts bringt?
Funktioniert auch aber ich will die ja sowieso nixht zurueck geben, versteh bloss nicht warum es nicht auch ohne const oder var geht?
Zitat:

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.
Warum sollte ich keine Records verwenden und die in Listen oder Dynamische Arrays tun?

vielen vielen Dank

hoika 5. Jan 2007 13:29

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

fgb 5. Jan 2007 13:37

Re: Zugriffverletzung beim Procedure Aufruf
 
Zitat:

Zitat von hoika
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

Ich fragte mich bloss warum ich Klassen in Listen bzw. Dyna. Arrays tun soll und nicht Records?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 Uhr.
Seite 1 von 2  1 2      

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