![]() |
Verhält sich "Result" wie eine globale Variable??
Hallo liebe Community!
Ich dachte eigentlich schon, wenigstens den Mechanismus von einfachen Funktionen in Delphi grundlegend verstanden zu haben. Nun allerdings hat es mich überrascht, dass das Result einer Funktion mit Rückgabetyp 'string' sich so verhält wie eine globale Variable: Der Inhalt von Result bleibt beim zweiten Aufruf erhalten. Kann mir jemand erklären, warum? Und wozu das gut ist? Meine heile Welt ist gerade zerbrochen :) |
Re: Verhält sich "Result" wie eine globale Variabl
Pure coincidence. "Result" ist eine implizite lokale Variable, die den Rückgabewert der Funktion beschreibt. Wenn der zwischen zwei Aufrufen gleich bleibt, hast du einfach nur Glück gehabt.
|
Re: Verhält sich "Result" wie eine globale Variabl
Hallo,
bleibt der Inhalt erhalten oder liegt die Variable zufällig auf dem gleichen Speicherplatz? |
Re: Verhält sich "Result" wie eine globale Variabl
Zitat:
Beim zweiten Aufruf von was? Der Funktion? Na wenn das Ergebnis doch das Gleiche ist? Oder ein zweiter Zugriff innerhalb der Funktion? Ja, denn für die Funktion ist Result erstmal nichts anderes als eine lokale Variable innerhalb der Funktion. Verstehe Deine Frage nicht so ganz. |
Re: Verhält sich "Result" wie eine globale Variabl
Ich würde sagen, er hat eine Funktion einmal im Programm aufgerufen, einen Rückgabewert erhalten und später im Programm die Funktion erneut aufgerufen und diese enthielt immer noch den alten Rückgabewert.
Nun ist seine Frage, ob das Ergebnis in Result global gespeichert wird, da sich der Inhalt dieser "Variable" nicht änderte. Grüße |
Re: Verhält sich "Result" wie eine globale Variabl
Also passt mal auf: Ich habe nur ein wenig rumgespielt und war dabei zu faul, mir eine zusätzliche lokale Variable zu deklarieren. Um meine Rückgabe zusammenzusetzen, benutzte ich daher result:
Delphi-Quellcode:
Wenn nun beim Ersten Aufruf in ca "'b','i','n',' '" stand, und beim Zweiten "'i','c','h',' ','d','o','o','f'", gab die Funktion am Ende den String "bin ich doof" zurück.
function getStringfromCharArr(ca:array of char):string;
var i,l:integer; begin // result:=''; ---Problemlösung :) l:=length(ca); for I := 0 to l - 1 do begin result:=result+string(ca[i]); end; end; |
Re: Verhält sich "Result" wie eine globale Variabl
Tut mir leid, aber ich blicke das nicht...
Angenommen ich habe folgende Funktion:
Delphi-Quellcode:
und rufe diese so auf:
Function MachMaPlus(a,b: Integer): String;
Begin Result := ''; Result := IntToStr(a+b); End;
Delphi-Quellcode:
Dann liefert diese Funktion mir 13 als String - egal ob ich das heute, morgen oder in 20 Jahren aufrufe.
MachMaPlus(6,7);
Was ist das für eine Frage, ob das global gespeichert wird? |
Re: Verhält sich "Result" wie eine globale Variabl
Result ist eine lokale Variable, und ihr Gültigkeitsbereich endet beim Verlassen der Funktion. Dass beim zweiten Aufruf der Funktion die Variable oft wieder auf den selben Speicherbereich fällt, ist ganz normal. Speicherreservierung ist ja keine völlig wahlfreie Zufallsangelegenheit. Das heißt aber nicht, dass man damit irgend etwas machen könnte. Eine Variable ist nur innerhalb ihres Gültigkeitsbereichs definiert, und sie enthält nur dann verwertbare Daten, wenn sie initialisiert wurde. Lass dich nicht davon täuschen, wenn zufällig noch alte Daten dort stehen, es könnte genausogut auch etwas völlig anderes sein.
|
Re: Verhält sich "Result" wie eine globale Variabl
Nochwas, wenn Du ein Array als Argument übergibst, dann solltest Du Dir daraus einen Type bauen!
Edit: RS. |
Re: Verhält sich "Result" wie eine globale Variabl
Okay, also mal anders:
Delphi-Quellcode:
Vielleicht isses jetzt besser verständlich.
var
s:string; a:array of char[2]; begin a[0]:='1'; a[1]:='1'; s:=getStringfromCharArr(a); //s enhält an dieser Stelle '11' //weiter... a[0]:='2'; a[1]:='2'; s:=getStringfromCharArr(a); //Ich hätte nun erwartetn, dass in s '22' steht. - "Neuer Funktionsaufruf, neues Glück." //Stattdessen steht darin aber '1122'. end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 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