Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi function mit eigenem Type als Rückgabewert -> Zugriffsver... (https://www.delphipraxis.net/109500-function-mit-eigenem-type-als-rueckgabewert-zugriffsver.html)

guitar1 2. Mär 2008 20:27


function mit eigenem Type als Rückgabewert -> Zugriffsver
 
Hi,

ich habe folgende Funktion:
Delphi-Quellcode:
function TBruchedit.CreateATermteil(ATyp: TTermteiltyp; ATermteil: string): TTermTeil; //die function ist overloaded
begin
  result.Typ:= ttNormalerTermteil;
  result.Termteil:= ATermteil; //<-- Zugriffsverletzung
end;
und an der gekenzeichneten Stelle kommt eine Zugriffsverletztung ...
TTermteil sieht so aus:
Delphi-Quellcode:
TTermteil = class(TObject)
    public
      Typ: TTermteiltyp; //TTermteiltyp = (ttBruch, ttNormalerTermteil, ttRechenzeichen);
      Bruch: TBruch;
      Termteil: String;
      Rechenzeichen: TRechenzeichen; //TRechenzeichen = (rzPlus, rzMinus, rzMal, rzGeteilt);
end;
wieso kommt es denn bitte ausgerechnet bei der zuweisung eines Strings zu einer Zugriffsverletzung und was kann ich dagegen tun?
ich habe es auch schon mit
Delphi-Quellcode:
result.Termteil:= 'blabla';
versucht, auch dann kam die Fehlermeldung?!

grüße
guitar1

omata 2. Mär 2008 20:30

Re: function mit eigenem Type als Rückgabewert -> Zugriff
 
Die Zugriffsverletzung entsteht garrantiert schon in der ersten Zeile.
Du erzeugt doch gar kein Objekt.

Edit: Dir fehlt ein Result:=TTermteil.create;
Das ist allerdings keine gute Lösung!

Gruss
Thorsten

MrKnogge 2. Mär 2008 20:31

Re: function mit eigenem Type als Rückgabewert -> Zugriff
 
Wenn TTermTeil eine Klasse ist, musst du schon eine Instance der Klasse erstellen (Stichwort .create).

Gruß
Christian

Christian Seehase 2. Mär 2008 20:39

Re: function mit eigenem Type als Rückgabewert -> Zugriff
 
Moin Guitar,

um die Aussagen meiner Vor"redner" noch zu ergänzen:
Wir hatten hier schon ein paar Mal die Diskussion darüber, wie man ein Objekt als Ergebnis zurückliefert, und kamen dort immer zu dem Schluss, dass man bereits eine Instanz der Klasse übergeben, und in der Funktion/Prozedur erst mit Werten füllen sollte.
Soll heissen:
Als Rückgabewert einer Funktion eignet sich ein Objekt nicht so sonderlich, da man dann eine schlechtere Übersicht darüber hat, wann diese wieder freizugeben ist. Ausserdem kann man eine Funktion auch, ohne Compilerwarnung, als Prozedur aufrufen, so dass die zurückgegebene Instanz nie wieder freigegeben werden kann, und somit ein Speicherleck verursacht.

guitar1 2. Mär 2008 20:40

Re: function mit eigenem Type als Rückgabewert -> Zugriff
 
:wall: mist, dieses Create vergess ich aber auch echt fast immer ... danke^^

also dass das keine gute lösung ist mit dem result:= TTermteil.Create weiß ich auch, aber ich benutze TTermteil auch noch in einer anderen Klasse vom typ TObjectList und dafür brauch ich dann halt TTermteil als klasse ..

xZise 2. Mär 2008 21:00

Re: function mit eigenem Type als Rückgabewert -> Zugriff
 
Ansonsten würde es auch so gehen:
Delphi-Quellcode:
procedure TBruchedit.CreateATermteil(ATyp: TTermteiltyp; ATermteil: string; var ACreatedTermTeil : TTermTeil); //die function ist overloaded
begin
  ACreatedTermTeil.Typ:= ttNormalerTermteil;
  ACreatedTermTeil.Termteil:= ATermteil; //<-- Zugriffsverletzung
end;
Übrigens ist es bei Turbo Delphi so dass er immer die nächste Zeile markiert.
Also dann einfach einen Breakpoint eine oder zwei Zeilen drüber setzten und dann per debugging testen ;)

MfG
xZise

Christian Seehase 2. Mär 2008 21:07

Re: function mit eigenem Type als Rückgabewert -> Zugriff
 
Moin Fabian,

const wäre hier besser, damit man gar nicht erst Gefahr läuft innerhalb der Methode etwas zuzuweisen:

Delphi-Quellcode:
procedure TBruchedit.CreateATermteil(ATyp: TTermteiltyp; ATermteil: string; const ACreatedTermTeil : TTermTeil); //die function ist overloaded
begin
  ACreatedTermTeil.Typ:= ttNormalerTermteil;
  ACreatedTermTeil.Termteil:= ATermteil; //<-- Zugriffsverletzung
end;

guitar1 2. Mär 2008 21:11

Re: function mit eigenem Type als Rückgabewert -> Zugriff
 
ahhh, jetzt gehts wunderbar!!
vielen Dank!!

xZise 4. Mär 2008 13:53

Re: function mit eigenem Type als Rückgabewert -> Zugriff
 
Zitat:

Zitat von Christian Seehase
Moin Fabian,

const wäre hier besser, damit man gar nicht erst Gefahr läuft innerhalb der Methode etwas zuzuweisen:

Delphi-Quellcode:
procedure TBruchedit.CreateATermteil(ATyp: TTermteiltyp; ATermteil: string; const ACreatedTermTeil : TTermTeil); //die function ist overloaded
begin
  ACreatedTermTeil.Typ:= ttNormalerTermteil;
  ACreatedTermTeil.Termteil:= ATermteil; //<-- Zugriffsverletzung
end;

Stimmt ;) Bei Klassen braucht man das ja nicht ;)

So wäre es vermutlich besser ;)
Delphi-Quellcode:
procedure TBruchedit.CreateATermteil(const ATyp : TTermteiltyp; const ATermteil : string; const ACreatedTermTeil : TTermTeil); //die function ist overloaded
begin
  if Assigned(ACreatedTermTeil) then // Test ob das Objekt existiert
  begin
    ACreatedTermTeil.Typ := ttNormalerTermteil;
    ACreatedTermTeil.Termteil := ATermteil;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz