AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Result einer Funktion "Stil Frage"

Ein Thema von Jonas Shinaniganz · begonnen am 4. Nov 2012 · letzter Beitrag vom 5. Nov 2012
 
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.549 Beiträge
 
Delphi 12 Athens
 
#10

AW: Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 21:39
Und ich dachte immer, das lokale Variablen grundsätzlich initialisiert werden müssen, egal ob sie Result heißen oder Strings oder Interfaces sind. Selbst der Delph-Compiler dürfte doch eine Warnung ausgeben, oder?
Nein, der Delphi-Compiler gibt leider nicht immer eine Warnung aus.

Praktisch gesehn werden "einfach" lokale Variablen nicht initialisiert, was man, im Prinzip, als eine Optimierung ansehn kann. (unnötiger/doppelter compilerseitiger Code)

Aber gewisse Typen, speziell alle, welche von Delphi eine automatische Speicherverwaltung bekommen haben, werden prinzipbedingt auch automatisch initialisiert, dazu zählen "lange" Strings (AnsiString, RawByteString, UTF8String und UnicodeString, aber keine ShortString), WideString, dynamische Arrays, Interfaces und der Variant, bzw. OleVariant.

Denn für die speicherverwaltung braucht es unbedingt einen definierten Grundzustand.


Der Witz daran ist, daß ein Result nicht immer eine lokale Variable ist, so wie man es vermuten könnte,
denn bei oben genannten Typen, ist das in Wirklichkeit kein "Result", sondern ein Var-Parameter.
Delphi verwaltet dieses Typen, sowie auch "größere" Array und Records als zusätzlichen Var-Parameter, welcher an die anderen Parameter angehängt wird.
Wo schlußendlich die "Result-Variable herkommt, ist also unklar.

Leider geht der Compiler nun, bei den genannten Typen, davon aus, daß diese somit initialisiert sind.
Welches aber gerade beim Result nicht "direkt" stimmt.

Die externe Variable wurde ordnungsgemäß initialisiert, aber, in Bezug auf die folgende Funktion, ist dieses nicht der Fall.
Delphi-Quellcode:
function Test: string;
begin
  Result := Result + 'abc';
end;

for i := 0 to 2 do
  S := Test;
ShowMessage(S);
Was für eine Message angezeigt wird, kannst du gerne ausprobieren.
(wenn es nicht zufällig eine Schleife wäre, dann wäre es natürlich "meistens" das 'abc')
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


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 15:28 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