AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Warum gibt es hier eine Acess Violation?

Ein Thema von Benmik · begonnen am 7. Dez 2018 · letzter Beitrag vom 18. Dez 2018
Antwort Antwort
Benmik

Registriert seit: 11. Apr 2009
552 Beiträge
 
Delphi 11 Alexandria
 
#1

Warum gibt es hier eine Acess Violation?

  Alt 7. Dez 2018, 23:03
In einem Modul deklariere ich:
Delphi-Quellcode:
type
  TDing = class(TObject)
    Nr: integer;
  end;
  TDingliste = class(TObjectList<TDing>)
  ...
  ...
  end;
In einem anderen Modul verwende ich das:
Delphi-Quellcode:
procedure Test;
var Dingliste:TDingliste;

  procedure Initialisiere;
  begin
    Dingliste := TDingliste.Create;
  end;

  procedure HierKnallts;
  var Ding:TDing;
  begin
    Ding := TDing.Create;
    Ding.Nr := 1;
    Dingliste.add(Ding); // Access Violation
  end;

begin
  Initialisiere;
  HierKnallts;
end;
Das verstehe ich nicht. Dingliste wird ordnungsgemäß erstellt und ist verfügbar. Nehme ich eine globale Variable für Dingliste, gibt es keine Probleme.

Geändert von Benmik ( 8. Dez 2018 um 00:04 Uhr) Grund: "begin" sollte schon da sein
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: Warum gibt es hier eine Acess Violation?

  Alt 7. Dez 2018, 23:17
Also mit 10.3 Rio kann ich nichts feststellen, da gibt es keine Exception.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
552 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Warum gibt es hier eine Acess Violation?

  Alt 7. Dez 2018, 23:38
Habe ich auch grad mal nachgebastelt, bei mir auch nicht. Dürfte ja auch gar nicht sein.
Woran könnte das theoretisch liegen?
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

AW: Warum gibt es hier eine Acess Violation?

  Alt 7. Dez 2018, 23:46
Beliebt ist Ding.Create statt TDing.Create
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
552 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Warum gibt es hier eine Acess Violation?

  Alt 8. Dez 2018, 00:04
Oouuh, jetzt fällt mir eine mögliche Antwort selber ein.

Die Routine "HierKnallts" ist eine Callback-Routine, deren aufrufende Routine von einer weiteren Unterprozedur von "Test" aufgerufen und mit @HierKnallts übergeben wird.
Obwohl man im Debugger die Variable ohne weiteres sieht, erinnere ich mich, dass es da mit der Sichtbarkeit Probleme gab. Daher funktioniert auch die globale Variable.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.402 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Warum gibt es hier eine Acess Violation?

  Alt 8. Dez 2018, 01:29
Ich kann nur den Rat geben niemals Variablen oberhalb von Unterroutinen einer Methode zu deklarieren. Das führt nur zu Konfusionen. Man sollte die benötigten Variablen an Unterroutinen immer direkt mitgeben.

Sprich statt:
Delphi-Quellcode:
procedure Test;
var
  Dingliste:TDingliste;

  procedure HierKnallts;
  begin
    Dingliste.add(Ding); // Access Violation
  end;

begin
  ...
  HierKnallts;
end;
Besser:
Delphi-Quellcode:
procedure Test;

  procedure HierKnallts(ADingliste: TDingliste);
  begin
    ADingliste.add(Ding);
  end;

var
  Dingliste: TDingliste;
begin
  ...
  HierKnallts(Dingliste);
end;
So kann man viel leichter debuggen was da wo schief geht...

Die Routine "HierKnallts" ist eine Callback-Routine, deren aufrufende Routine von einer weiteren Unterprozedur von "Test" aufgerufen und mit @HierKnallts übergeben wird.
Obwohl man im Debugger die Variable ohne weiteres sieht, erinnere ich mich, dass es da mit der Sichtbarkeit Probleme gab. Daher funktioniert auch die globale Variable.
Wenn es Probleme mit der Sichtbarkeit gäbe, würde es nicht kompilieren. Alles andere was mit Sichtbarkeit zu tun hat, würde nur zu dem Problem führen, wenn es irgendwo eine zweite gleichnamige Variable geben würde.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
8. Dez 2018, 05:29
Dieses Thema wurde am "08. Dec 2018, 06:29 Uhr" von "Luckie" aus dem Forum "Algorithmen, Datenstrukturen und Klassendesign" in das Forum "Object-Pascal / Delphi-Language" verschoben.
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Warum gibt es hier eine Acess Violation?

  Alt 8. Dez 2018, 06:12
Hallo,
dein Code ist bestimmt nur dem richtigen Code nachgestellt. .?
Ichbdenke, Du hast die Listenvariable doppelt deklariert.
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:38 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