Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler: Variable "self" inaccessible due to optimization (https://www.delphipraxis.net/126307-fehler-variable-self-inaccessible-due-optimization.html)

Pellekaeptn 22. Dez 2008 16:25


Fehler: Variable "self" inaccessible due to optimi
 
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

jbg 22. Dez 2008 16:35

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

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 :wink:

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)).

Pellekaeptn 22. Dez 2008 17:08

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

Zitat von jbg
Zitat:

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:

Zitat von jbg
Und was ist mit "Element"? Delphi wird sich den Speicherbereich dafür mit Sicherheit nicht selbst suchen :wink:

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 :roll:

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 :)

DeddyH 22. Dez 2008 17:13

Re: Fehler: Variable "self" inaccessible due to op
 
Da es sich ja allem Anschein nach um eine doppelt verkettete Liste handelt, verweise ich mal auf das entsprechende Tutorial.

Pellekaeptn 30. Dez 2008 11:09

Re: Fehler: Variable "self" inaccessible due to op
 
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 :)


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