Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   warum scheitert die Prüfung auf NIL (https://www.delphipraxis.net/210415-warum-scheitert-die-pruefung-auf-nil.html)

bernhard_LA 21. Apr 2022 10:55

warum scheitert die Prüfung auf NIL
 
warum bekomme ich eine Zugriffsverletzung wenn ich im Unterprogramm meiner Graphen Klasse
die VertexListe löschen möchte ?
Der aufrufende der Code :

Delphi-Quellcode:
 .........
var
  _V1, _V2: TObjectList<TVertex<Integer>>;
  aVertex: TVertex<Integer>;
  i, j: Integer;
begin


  if (G <> nil) then
  begin
     G.partitionTwo(_V1, _V2);


  .....
  end;


die beiden Vertexlisten werden in der Routine partitionTwo erzeugt wenn die Abfrage Nil ergibt.
Sollte doch so auch klappen, im aufrufenden Code (siehe oben) erzeuge ich sie ja nicht :-)



Delphi-Quellcode:

procedure TGraph<Tdata>.partitionTwo(
  var _V1: TObjectList<TVertex<Tdata>>;
  var _V2: TObjectList < TVertex < Tdata >> );
var
  v: TVertex<Tdata>;
  _V1connected: Boolean;

  i, j, k: Integer;
begin
  ///
  /// reset all vertex flags to 0
  ///
  self.clear_colors;

  if (_V1 = nil) then
    ///
    ///   no need to create vertex list prior to this function call
    ///
    begin
    _V1 := TObjectList < TVertex < Tdata >>
      .Create(TVertex<Tdata>.createVertexComparer(), false);
    end;

  if (_V2 = nil) then
    ///
    ///
    ///
    begin
    _V2 := TObjectList < TVertex < Tdata >>
      .Create(TVertex<Tdata>.createVertexComparer(), false);
    end;

  _V1.clear;
  _V2.clear;    ///  -> hier die Zugriffsverletzung :-( 


  .......

Tatsächlich kommt es zur AV beim zweiten List.Clear Befehl, warum ??

himitsu 21. Apr 2022 11:25

AW: warum scheitert die Prüfung auf NIL
 
War auch jemand zu Beginn auf die abwegige Idee gekommen diese Variablen G/_VI/_V2 auch mit NIL zu initialisieren?

bernhard_LA 21. Apr 2022 11:55

AW: warum scheitert die Prüfung auf NIL
 
ist ein Object automatisch auf nil solange ich noch kein Object.Create ausgeführt habe ?


wie schreibe ich denn in Delphi code der folgende macht:


Delphi-Quellcode:

if ( Objekt noch nicht erzeugt)  dann ( Erzeuge diese ObjeKt ) ;

Maliko 21. Apr 2022 12:11

AW: warum scheitert die Prüfung auf NIL
 
Nicht unbedingt. Wenn du ein Objekt nicht instanzierst, ist das Objekt oft nil, aber es kann auch sein, dass sich in dem Adressblock, welcher für das Objekt auf dem Heap verwendet wird noch irgendwelche "Altlasten" drin stehn. Dann hat das Objekt nicht den Wert nil. Wenn du wirklich sicher stellen willst, dass das Objekt nil ist, dann deklariere es vorher als nil.

Sprich
Delphi-Quellcode:
mObject := nil;

completestranger 21. Apr 2022 12:16

AW: warum scheitert die Prüfung auf NIL
 
Zitat:

Zitat von bernhard_LA (Beitrag 1504848)
ist ein Object automatisch auf nil solange ich noch kein Object.Create ausgeführt habe ?

gilt nur für lokale variablen
deine variablen kommen aber aus der methoden-signatur

korrektur:
gilt natürlich nicht für objekte, sorry

himitsu 21. Apr 2022 13:18

AW: warum scheitert die Prüfung auf NIL
 
Globale Variablen und ObjektFelder werden autoamtisch mit 0 (nil) initialisiert.

Alle anderen Variablen, vor allem lokale Variablen in Methoden, werden nur dann automatisch initialisiert, wenn es sich um gemanagte Typen handelt (String/DynArray/Interface/Variant), aber eben keine TObjekt, Pointer, Integer usw.

Mit ARC, in mobilen Compilern, gab es mal in Android/MacOS auch eine Initialisierung für Objekte, da sie dort wie Interfaces behandelt wurden, also gemanaget.



Normal sollte hier aber der Compiler auch eine entsprechende Warnung werfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 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