AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi AV innerhalb des if-Statements lässt sich nicht abfangen
Thema durchsuchen
Ansicht
Themen-Optionen

AV innerhalb des if-Statements lässt sich nicht abfangen

Ein Thema von uups · begonnen am 11. Nov 2017 · letzter Beitrag vom 15. Jan 2018
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#11

AW: AV innerhalb des if-Statements lässt sich nicht abfangen

  Alt 13. Nov 2017, 15:07
Wahrscheinlich macht er sowas in der Art:
Delphi-Quellcode:
if (Obj.Foo = Bla) and (Obj.MethodeDieObjEvtlFreigibt) and (Obj.Bar = Bla) then
begin
  ...
So oder so hat Luckie recht mit seiner Aussage, dass man das Problem wohl besser an der Wurzel anpacken sollte. Klingt zumindest verdächtig nach nicht gut durchdachten Code-Design.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.174 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: AV innerhalb des if-Statements lässt sich nicht abfangen

  Alt 14. Nov 2017, 07:22
Klingt zumindest verdächtig nach nicht gut durchdachten Code-Design.
Solche Wertungen tun weh, sind unsachlich + nicht hilfreich.

Ich würde eine boolsche-Variable einführen + die if-Abfrage aufdröseln:
Code:
bTest:=true;
if bTest then begin
  bTest:=bTest and Bedingung1;
end;
if bTest then begin
  bTest:=bTest and Bedingung2;
end;
...
Je nachdem, wie kompliziert das If ist, muss man das ev. noch verschachteln. Aber so hat man recht schnell die problematische Abfrage.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: AV innerhalb des if-Statements lässt sich nicht abfangen

  Alt 14. Nov 2017, 08:18
Der TE hat sich zuletzt am 11. November gemeldet.
Es ist wohl müssig weitere Tipps zu geben.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#14

AW: AV innerhalb des if-Statements lässt sich nicht abfangen

  Alt 14. Nov 2017, 08:27
Klingt zumindest verdächtig nach nicht gut durchdachten Code-Design.
Solche Wertungen tun weh, sind unsachlich + nicht hilfreich.
Finde jetzt nicht, dass meine Vermutung abwertend oder unhöflich war und wenn sie doch so aufgenommen wurde, dann war das definitiv nicht meine Intention. Da der TE sich bisher nicht mehr gemeldet hat, sicherlich ein wenig spekulativ (aber dennoch basierend auf den vorher getätigten Aussagen).

Deshalb bleibe ich dabei:
Wenn ich mir während ich auf einem Objekt arbeite (sogar zwischen zwei Bedingungen/Funktionsaufrufen in einer Abfrage) dieses Objekt selbst unter den Füßen wegziehe, indem ich es zerstöre, dann ist das nunmal - vorsichtig ausgedrückt - kein optimales Code-Design. Sowas passiert auch (die Verwendung von Threads mal abgesehen) wirklich nur dann, wenn man nicht eindeutig definiert, wer ein Objekt "besitzt". Im Optimalfall sollte der Besitzer das Objekt sowohl erstellen, als auch nach getaner Arbeit wieder freigeben.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#15

AW: AV innerhalb des if-Statements lässt sich nicht abfangen

  Alt 15. Jan 2018, 13:13
bevor dein IF-block anfängt setz ein boolean auf dein objekt,
markier es.
innerhalb deines IF-block reagier auf den boolean.
der externe code der das objekt behandelt muss dann lediglich das boolean setzen.
true = objekt steht zur verfügung
false = objekt ist futsch.
so kann dein IF-block um ein weiteres IF-"boolean" ergänzt werden ))
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: AV innerhalb des if-Statements lässt sich nicht abfangen

  Alt 15. Jan 2018, 13:25
Moin,

Dein Engagement als neues Mitglied des Forums in alle Ehren. Aber Dein Ratschlag hier ist haarsträubend. Wenn das boolsches Flag Teil des Objektes ist, dann geht es mitsamt dem Objekt unter, wenn das Objekt freigegeben wird. Und eine frei herumbaumelnde boolsche Variable als "Buchhaltung", ob ein Objekt noch da ist oder nicht, führt in kürzester Zeit zum Chaos.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#17

AW: AV innerhalb des if-Statements lässt sich nicht abfangen

  Alt 15. Jan 2018, 15:20
Die Diskussion ist so alt wie der Pointer selbst. Entweder man programmiert passiv und frägt in der Funktion alles ab oder man ist aktiv und prüft Zeiger vor der Übergabe.

Aktiv kann man so weit treiben, dass man Fehler in der Logik auf Speicherverletzungen zurückführt oder einfach bieder prüft bevor man ein Objekt zumeist an eine Prozedur/Methoden usw.. übergibt.

Wenn man weiß was man tut, kann man auch mit einem NULL Objekt arbeiten, sprich ein leeres Objekt mit gültiger Speicheradresse. Das wäre was in der Antwort nach deiner wurde angedeutet.

Als Beispiel aus der reinen prozeduralen Welt einen Ringbuffer als doppelt verkettete Liste realsiert in die man nur in der Mitte einfügt und rauslöscht wäre ähnlich gelagert.

Damit man aber nicht verrückt müsst man ein reines Objektsystem (ala) Smalltalk haben oder Mehrfachvererbung. Eine Interface welches Assigned zurückgibt usw...

Sämtliche passive Varianten leiden of darunter schwer zu debuggen zu sein. Du bekommst teils 'Side Effect' artige technisch korrekte, aber anwendungssemantisch schlicht falsche Ergebnisse. Logikfehler werden einfach verschleppt.


Deshalb bleibe ich dabei:
Wenn ich mir während ich auf einem Objekt arbeite (sogar zwischen zwei Bedingungen/Funktionsaufrufen in einer Abfrage) dieses Objekt selbst unter den Füßen wegziehe, indem ich es zerstöre, dann ist das nunmal - vorsichtig ausgedrückt - kein optimales Code-Design. Sowas passiert auch (die Verwendung von Threads mal abgesehen) wirklich nur dann, wenn man nicht eindeutig definiert, wer ein Objekt "besitzt". Im Optimalfall sollte der Besitzer das Objekt sowohl erstellen, als auch nach getaner Arbeit wieder freigeben.
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#18

AW: AV innerhalb des if-Statements lässt sich nicht abfangen

  Alt 15. Jan 2018, 15:55
was ich meinte war:

var
objectAvail: boolean;

begin
objectAvail := False;
procedure initObject;
begin
...code der das object zur verfügung stellt und festgestellt wird obs initialisiert ist mit diesem ergebnis:
objectAvail:= True;
end;
procedure killObject;
begin
...code der das object freigibt mit diesem ergebnis:
objectAvail:= False;
end;

initObject;
IF-block start..
if objectAvail then ...code
endif;
end;

oder hab ich alles falsch verstanden?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#19

AW: AV innerhalb des if-Statements lässt sich nicht abfangen

  Alt 15. Jan 2018, 16:11
Und jetzt das nochmal mit zwei Instanzen dieser Klasse, aber weiterhin nur mit der einen globalen Variable.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
532 Beiträge
 
Delphi 10.3 Rio
 
#20

AW: AV innerhalb des if-Statements lässt sich nicht abfangen

  Alt 15. Jan 2018, 16:40
Der Sinn von einem Record und auch das revolutionäre der Verbundstrukturen war, dass man Informationen Gruppieren konnte und pro Instanz konnte gemeinsam verwalten. Ein Objekte als Instanz einer Klasse fällt in diese Kategorie. Vorher gab es nur ARRAYS von Basisdatentypen.

Aber du kannst nur auf Informationen bestehender Verbundstrukturen zugreifen und sonst sind die Objekte gleich und das wird ausgedrückt durch NULL/NIL.

Du sagst, 'Not In List'. Alternativ dazu wäre das NULL resp. Leere Objekt. In dem könnte man isAlive := False setzen.

Selbst wenn du eine Verbundstruktur schachtelst.

Delphi-Quellcode:

type TEnvelope = record
  // pointer to object
  reference : POINTER TO AbstractDataType // in Modula Slang
  isAlive : boolean;
end;
Kannst du dir noch immer nicht sicher sein, ob die Referenz noch lebt. Du könntest das zwar mit Klassen machen und sicherstellen, dass IsAlive private bleibt und nur ausglesen werden kann und unter Verantwortung der Klasse TEnvolope synchron mit der Erzeugung einer Objektinstanz gesetzt wird usw... Das Problem ob der Envelope initialisiert ist bleibt und damit ist nichts gewonnen.

Dann hast du nur Schnittstellen die TEnvelopes übergeben bekommen

Du kannst noch die Erzeugung der Objekte der Klasse überlassen und die Verwaltung ihrer Instanzen und indirekt zugreifen. Im Fall von NotAssigned käme ein leeres Objekt zurück. Damit würdest du die Abfrage mit Assigned netter gestalten, aber ändert nichts am langen Ende. Dadurch, dass die Klasse die Objekte selbst verwaltet verschwindet auch deine Verantwortung dieses Singelton freizugeben.

was ich meinte war:

var
objectAvail: boolean;

begin
objectAvail := False;
procedure initObject;
begin
...code der das object zur verfügung stellt und festgestellt wird obs initialisiert ist mit diesem ergebnis:
objectAvail:= True;
end;
procedure killObject;
begin
...code der das object freigibt mit diesem ergebnis:
objectAvail:= False;
end;

initObject;
IF-block start..
if objectAvail then ...code
endif;
end;

oder hab ich alles falsch verstanden?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 01:22 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