AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Rückgabewert von Funktionen / evtl. Problem mit try..finally
Thema durchsuchen
Ansicht
Themen-Optionen

Rückgabewert von Funktionen / evtl. Problem mit try..finally

Ein Thema von changlee · begonnen am 2. Dez 2004 · letzter Beitrag vom 6. Dez 2004
Antwort Antwort
Seite 1 von 3  1 23      
changlee
(Gast)

n/a Beiträge
 
#1

Rückgabewert von Funktionen / evtl. Problem mit try..finally

  Alt 2. Dez 2004, 13:34
Hallo,
ich habe ein grundsätzliches Verständnisproblem was den Rückgabewert einer Funktion angeht.
Bevor ich viel drum herum rede hier einfach zwei code-Beispiele:

Delphi-Quellcode:
function meineFkt(str: String): TMeinTyp;
var x : TMeinTyp;
begin
  x:=TMeinTyp.Create;
  try
    x.property1:='Hallo 1';
    x.property2:='Hallo 2';
    result:=x;
  finally
    x.free;
  end;
end;
Bei der Obenstehenden Funktion wird kein Wert zurückgegeben (bzw. wird ein Leerstring zurückgegeben).

Schreibe ich hingegen..
Delphi-Quellcode:
function meineFkt(str: String): TMeinTyp;
var x : TMeinTyp;
begin
  x:=TMeinTyp.Create;
  x.property1:='Hallo 1';
  x.property2:='Hallo 2';
  result:=x;
end;
..funktioniert alles so wie es sollte. Damit könnte man sich eigentlich zufrieden geben.
Aber ich würde gern dazu zwei Dinge wissen:
1. wann funktioniert result? Nur am Ende einer Funktion / außerhalb von Schleifen?
2. Wenn ich x.free nicht aufrufe, hat das irgendwelche Nachteile, oder wird x sowieso nach Funktionsende wieder freigegeben, da es sich um eine lokale Variable handelt?

An try..finally kann es widerum eigendlich nicht liegen, denn wenn ich folgendes schreibe klappt es auch nicht:
Delphi-Quellcode:
function meineFkt(str: String): TMeinTyp;
var x : TMeinTyp;
begin
  x:=TMeinTyp.Create;
  x.property1:='Hallo 1';
  x.property2:='Hallo 2';
  result:=x;
  x.free;
end;
Kann mir diesbezüglich jemand weiterhelfen?
Das wär wirklich sehr nett!

mfg
changlee
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin

  Alt 2. Dez 2004, 13:38
Es wird dir nichts zurückgegeben, weil du das Objekt und somit den Speicherbereich wieder freigibst.
result := x; Beinhaltet nur die Kopie eines Zeigers. Gibst du mit
x.Free; das Objekt frei und machst so den Zeiger ungültig, ist auch die Kopie leer.

Ich würde so was imme rmit var Parametern lösen, dann weiß man dass der Aufrufer dafür verantwortlich ist, denm Speicher auch wieder aufzuräumen. L´äßt du nämlich das Free weg, hast du Speicherleichen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin

  Alt 2. Dez 2004, 13:41
result ist vom Typ deines Rückgabe-Typs.
Früher gabs result gar nicht. Da musste man das Ergebnis dem Funktionsnamen zuweisen. Da es aber manchmal notwendig ist, mit Zwischenergebnissen des Funktionsergebnisses innerhalb der Funktion weiter zu arbeiten, wurde von Borland Result eingeführt. Ansonsten gibt es rekursive Funktionsaufrufe.

Das bedeutet in deinem Fall, solange du die Werte deiner Variablen nicht der Funktion oder result zuweist, weiß die Funktion auch nicht welchen Wert sie zurückliefern soll.
Deine temporäre Variable benötigst du also gar nicht, da du Result dafür verwenden kannst.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#4

Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin

  Alt 2. Dez 2004, 13:41
Es wird der Wert zurückgegeben der zuletzt in result gespeichert.

Da Objekte als Zeiger übergeben werden, wird auch nur der Zeiger zurückgegeben und wie Luckie schon sagte, zerstörst du das Objekt bevor du die Funktion beendest. Deshalb bekommst du nichts sinnvolles zurück.

[edit]Willkommen bei der Delphi-PRAXIS. [/edit]
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin

  Alt 2. Dez 2004, 13:43
Zitat von Jasocul:
Deine temporäre Variable benötigst du also gar nicht, da du Result dafür verwenden kannst.
Macht aber Sinn, da der Kompiler so noch das eax Register zur Verfügung hat und so besser optimieren kann. Aber das ist nicht sein Problem.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#6

Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin

  Alt 2. Dez 2004, 13:53
Hallo,
vielen Dank für die schnellen aussagekräftigen Antworten!
Ich werde es jetzt wohl mit var-Parametern lösen.
mfg
changlee
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin

  Alt 2. Dez 2004, 14:11
Zitat von changlee:
Hallo,
vielen Dank für die schnellen aussagekräftigen Antworten!
Ich werde es jetzt wohl mit var-Parametern lösen.
Warum?
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin

  Alt 2. Dez 2004, 14:17
OK, das Schlüsselwort var dürfte zwar überflüssig sein. Macht aber deutlich was passiert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#9

Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin

  Alt 2. Dez 2004, 14:18
Hi,
warum nicht? (Lucky hatte es doch auch so vorgeschlagen).
mfg
changlee
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin

  Alt 2. Dez 2004, 14:29
Ich bin nicht unfehlbar und es mag noch andere Möglichkeiten geben ohne dass ein Speicherleck zurück bleibt. Nur mir var Parametern scheint es mir am einfachsten und sichersten zu sein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 08:50 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