AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Fehler: Variable "self" inaccessible due to optimization
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler: Variable "self" inaccessible due to optimization

Ein Thema von Pellekaeptn · begonnen am 22. Dez 2008 · letzter Beitrag vom 30. Dez 2008
Antwort Antwort
Pellekaeptn

Registriert seit: 14. Dez 2008
3 Beiträge
 
#1

Fehler: Variable "self" inaccessible due to optimi

  Alt 22. Dez 2008, 17:25
Hallo alle zusammen!

Ich schreib grad mein Infoprojekt mit Delphi 7 und bin am verzweifeln. Ich bin auch nicht so bewandert im Programmieren (aber es macht mir Spaß ), außer in der Schule mach ich da nichts, also entschuldige ich mich jetzt schonmal im Voraus für meine blöden Fragen...

Ein Modul meines Programms ist eine Unit "Keller" (also ein Stack). Leider funktioniert die bei mir gar nicht.
Hier erstmal der Quelltext Push-Funktion:

Delphi-Quellcode:
unit Keller;

interface
type
  ZElement = ^TElement;
  TElement = record
    Daten: string;
    Voriges, Naechstes: ZElement;
  end;

  TKeller = class(TObject)
    public
      constructor Create();
      procedure Push(eintrag: string);
      function Pop(): ZElement;
    private
      Erstes: ZElement;
  end;


implementation

constructor TKeller.Create();
begin
  inherited;
  Erstes := nil;
end;


procedure TKeller.Push(eintrag: string);
var
  X,Y: ZElement; Letztes: ZElement; Element:TElement;
begin
  NEW(X);
  NEW(Y);
  Element.daten:=eintrag;
  Element.Naechstes:=X;
  Element.Voriges:=Y;
  if (Erstes <> nil) then
  begin
    Letztes := Erstes;
    while (Letztes^.Naechstes <> nil) do
      Letztes := Letztes^.Naechstes;
    Letztes^.Naechstes := @Element;
    Element.Naechstes := nil;
    Element.Voriges := Letztes;
  end else
  begin
    Erstes := @Element; //hier ist Element noch zb. ('bla',#ECF45G,#ECF45H)
    Element.Naechstes := nil; //hier auch (außer das neue nil)
    Element.Voriges := nil; //hier auch (außer das neue nil)
  end; //hier ist Element jetzt ('',nil,nil)
end;
Er zeigt keine Fehler mehr an oder so, ein Test-Programm läuft auch, aber spätestens bei der Pop-funktion gibts Ärger.
Ich hab dann mal mit F7 durchgeschaltet und hab ne Watchlist gemacht und bin zu folgender interessanter Sache gekommen: schon beim ersten push (also wenn erstes noch nil ist) passiert etwas Seltsames: wenn man bei "Erstes := @Element;" steht Element noch auf ('eingegebener string, adresse, adresse). Wenn er aber die nächsten 2 Zeilen durchlaufen hat und die beiden Adressen nil sind, hat sich plötzlich auch Element.daten verändert: von einer Zeile zur anderen ist Element plötzlich ('',nil,nil).
Außerdem stand bei der Watchlist auch einmal "Variable "Self" inaccessible here due to optimization". Ich hab doch gar keine Variable Self???

Die Delphi-Hilfe und Forum-Suche haben mir leider gar nicht weitergeholfen, aber schonmal vielen Dank für eure Mühe und Entschuldigung für die dämlichen Fragen und alles

Viele Grüße und einen schönen Abend noch
der Pellekaeptn
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Fehler: Variable "self" inaccessible due to op

  Alt 22. Dez 2008, 17:35
Zitat von Pellekaeptn:
ZElement = ^TElement;
Hast du das so mit dem Z gelernt? Denn normalerweise wird hier P (wie in Pointer) verwendet.

Zitat:
Delphi-Quellcode:
var
  X,Y: ZElement; Letztes: ZElement; Element:TElement;
begin
  NEW(X);
  NEW(Y);
  Element.daten:=eintrag;
  Element.Naechstes:=X;
  Element.Voriges:=Y;
Spiel das mal in Gedanken durch. Du möchtest ein Element hinzufügen, erstellt dafür aber zwei Einträge? Und was ist mit "Element"? Delphi wird sich den Speicherbereich dafür mit Sicherheit nicht selbst suchen

Zitat:
Außerdem stand bei der Watchlist auch einmal "Variable "Self" inaccessible here due to optimization". Ich hab doch gar keine Variable Self???
Doch die Variable Self hast du. Das ist der "Punkt" zwischen "TKeller" und "Push" (wenn man es so will). Der Compiler übergibt das Objekt (in diesem Fall von der Klasse TKeller) im versteckten Self-Parameter. (Andere Sprachen nennen das "this" (C++/C#/Java) oder "me" (VisualBasic)).
  Mit Zitat antworten Zitat
Pellekaeptn

Registriert seit: 14. Dez 2008
3 Beiträge
 
#3

Re: Fehler: Variable "self" inaccessible due to op

  Alt 22. Dez 2008, 18:08
Zitat von jbg:
Zitat von Pellekaeptn:
ZElement = ^TElement;
Hast du das so mit dem Z gelernt? Denn normalerweise wird hier P (wie in Pointer) verwendet.
Ja dass das allgemein mit dem P gemacht wird weiß ich, aber wir haben es im Unterricht mit dem Z gemacht...

Zitat von jbg:
Und was ist mit "Element"? Delphi wird sich den Speicherbereich dafür mit Sicherheit nicht selbst suchen
Aber wie weis ich denn nen Speicherbereich zu??? Ich dachte das wäre hier dasselbe als wenn ich ne Variable a deklariere und ihr dann den Wert 3 zuweise.
Und was du damit meinst, dass ich zwei Einträge erstelle, verstehe ich leider nicht. Meinst du New(x) und dann element.naechst:=x? Sorry

Und das mit dem Self hab ich einigermaßen verstanden aber die Fehlermeldung versteh ich trotzdem nicht. In der Delphi-Hilfe hört sich das für mich so an, als ob da einer Variable ein Wert zugewiesen wird der aber gar nicht verwendet wird... was daran so schlimm ist (sicher, effizient ist es nicht) versteh ich aber nicht...

Trotzdem schonmal vielen, vielen Dank
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

Re: Fehler: Variable "self" inaccessible due to op

  Alt 22. Dez 2008, 18:13
Da es sich ja allem Anschein nach um eine doppelt verkettete Liste handelt, verweise ich mal auf das entsprechende Tutorial.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Pellekaeptn

Registriert seit: 14. Dez 2008
3 Beiträge
 
#5

Re: Fehler: Variable "self" inaccessible due to op

  Alt 30. Dez 2008, 12:09
Dankeschön.
Jetzt klappts. Allerdings waren im Tuturial auch ein paar Schreibfehler, und die doppelt verkettete Liste wollte bei mir (auch nicht bei direktem Copy&Paste) einfach nicht funktionieren.
Hab es jetzt auf eine einfach verkettete Liste reduziert und es klappt.
Dankeschön
  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 12:41 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