![]() |
function mit eigenem Type als Rückgabewert -> Zugriffsver
Hi,
ich habe folgende Funktion:
Delphi-Quellcode:
und an der gekenzeichneten Stelle kommt eine Zugriffsverletztung ...
function TBruchedit.CreateATermteil(ATyp: TTermteiltyp; ATermteil: string): TTermTeil; //die function ist overloaded
begin result.Typ:= ttNormalerTermteil; result.Termteil:= ATermteil; //<-- Zugriffsverletzung end; TTermteil sieht so aus:
Delphi-Quellcode:
wieso kommt es denn bitte ausgerechnet bei der zuweisung eines Strings zu einer Zugriffsverletzung und was kann ich dagegen tun?
TTermteil = class(TObject)
public Typ: TTermteiltyp; //TTermteiltyp = (ttBruch, ttNormalerTermteil, ttRechenzeichen); Bruch: TBruch; Termteil: String; Rechenzeichen: TRechenzeichen; //TRechenzeichen = (rzPlus, rzMinus, rzMal, rzGeteilt); end; ich habe es auch schon mit
Delphi-Quellcode:
versucht, auch dann kam die Fehlermeldung?!
result.Termteil:= 'blabla';
grüße guitar1 |
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 |
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 |
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. |
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 .. |
Re: function mit eigenem Type als Rückgabewert -> Zugriff
Ansonsten würde es auch so gehen:
Delphi-Quellcode:
Übrigens ist es bei Turbo Delphi so dass er immer die nächste Zeile markiert.
procedure TBruchedit.CreateATermteil(ATyp: TTermteiltyp; ATermteil: string; var ACreatedTermTeil : TTermTeil); //die function ist overloaded
begin ACreatedTermTeil.Typ:= ttNormalerTermteil; ACreatedTermTeil.Termteil:= ATermteil; //<-- Zugriffsverletzung end; Also dann einfach einen Breakpoint eine oder zwei Zeilen drüber setzten und dann per debugging testen ;) MfG xZise |
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; |
Re: function mit eigenem Type als Rückgabewert -> Zugriff
ahhh, jetzt gehts wunderbar!!
vielen Dank!! |
Re: function mit eigenem Type als Rückgabewert -> Zugriff
Zitat:
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