Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Lokale Varaiablen bei der Deklaration initialisieren (https://www.delphipraxis.net/96134-lokale-varaiablen-bei-der-deklaration-initialisieren.html)

Viktorii 19. Jul 2007 09:56


Lokale Varaiablen bei der Deklaration initialisieren
 
Moin zusammen.

Evtl. ne dumme Frage, aber ich habe bis jetzt nur wenig Erfahrung in Delphi. Bin eigentlich ehr ein C Mensch.
Ich mag es nicht wenn Variablen uninitialisiert in Gegend rumstehen. Bis jetzt mache ich die Initialisierung so:

Delphi-Quellcode:
function SendByte(Byte: char; devHAndle: FT_HANDLE):Integer;
var
  ret                      : FT_Return;
  WriteBuffer              : array[1..8] of byte;
  NumberOfBytesToWrite     : Integer;
  NumberOfBytesWritten     : DWORD;
  i                        : Integer;

begin
  ret                 := 0;
  NumberOfBytesToWrite := 8;
  NumberOfBytesWritten := 0;
  i                   := 0;

  for i := 1 to 8 do
    begin

    ...
    ...
    ...
Ich finde es aber doof die ganze Latte der deklarierten Variablen noch mal am Anfang der Funktion für die Initialisierung aufzuführen. Gibt es da nicht eine Möglichkeit wie z.B. bei C, die Initialisierung gleich bei der Deklaration durchzuführen?

SuFu und Tante Google haben mir nicht wirklich weiterhelfen können.

Vielen Dank im vorraus.

fwsp 19. Jul 2007 09:57

Re: Lokale Varaiablen bei der Deklaration initialisieren
 
[unsinn]
Delphi-Quellcode:
function SendByte(Byte: char; devHAndle: FT_HANDLE):Integer;
var
  ret                      : FT_Return;
  WriteBuffer              : array[1..8] of byte = (1,2,3,4,5,6,7,8);
  NumberOfBytesToWrite     : Integer = 0;
  NumberOfBytesWritten     : DWORD = 9;
  i                        : Integer = 456;

begin
  ...
probier das mal.[/unsinn]

//Edit1
stimmt: lokale variablen können nicht initialisiert werden.

Elvis 19. Jul 2007 10:00

Re: Lokale Varaiablen bei der Deklaration initialisieren
 
Nein, geht leider in Delphi nicht.
Aber es macht auch nicht immer Sinn lokale Variablen zu initialisieren.
Dein i zum Beispiel wird hoffentlich nur innerhalb des for-loops benutzt und innerhalb des Blockes ist sein Wert immer genau definiert.
Nur wenn du tatsächlich einen Wert auslesen könntest, dem noch nix zugewiesen wurde, lohnt es sich ihn zu initialisieren.

Stefan.Buchholtz 19. Jul 2007 10:03

Re: Lokale Varaiablen bei der Deklaration initialisieren
 
Nein, in Delphi können lokale Variablen nicht bei der Deklaration initialisiert werden.
Redundante Zuweisungen (wie z.B. auf i in deinem Beispiel) werden vom Delphi-Compiler ohnehin rausoptimiert. Weil der Compiler auch davor warnt, wenn auf den Wert einer nicht initialisierten Variablen zugegriffen wird, ist eine generelle Initialisierung aller lokalen Variablen meiner Meinung nach ohnehin nicht sinnvoll.

Stefan

sirius 19. Jul 2007 10:05

Re: Lokale Varaiablen bei der Deklaration initialisieren
 
"Lokale Variablen können nicht initialisiert werden."

Liegt einfach daran, dass es keinen Sinn macht.
Globale Variablen werden ja schon in der Datei im Datensegment (DataSection) "gespeichert". Da lohnt es sich ihnen gleich einen Wert zu geben.
Lokale Variablen liegen auf dem Stack (wenn üpberhaupt; manchmal ja nur in den Registern). Da ist eine Initialisierung vom Compiler nicht möglich. Also müsste sie zur Laufzeit geschehen.
Nun könnte Delphi zwar (wie C) zulassen, dass man sowas, wie fwsp, in der Deklaration mit angeben kann. Das würde aber im Code der EXE zu keinem anderen Ergebnis führen, wie deine Variante.

Viktorii 19. Jul 2007 10:33

Re: Lokale Varaiablen bei der Deklaration initialisieren
 
Vielen Dank erstmal an alle...

Zitat:

Zitat von Elvis
Nein, geht leider in Delphi nicht.
Aber es macht auch nicht immer Sinn lokale Variablen zu initialisieren.
Dein i zum Beispiel wird hoffentlich nur innerhalb des for-loops benutzt und innerhalb des Blockes ist sein Wert immer genau definiert.
Nur wenn du tatsächlich einen Wert auslesen könntest, dem noch nix zugewiesen wurde, lohnt es sich ihn zu initialisieren.

Okay, bei dem i hast du natürlich recht. Aber wenn es beispielsweise eine while loop wäre mit dem in-/dekrementierendem i und z.B. einer zweiten Bedingung, muss das i ja auch einen definierten Wert haben ....



Zitat:

Zitat von sirius
Das würde aber im Code der EXE zu keinem anderen Ergebnis führen, wie deine Variante.

Das ist mir schon klar. Es ging mir halt nur um die Übersichtlichkeit, also nicht alles doppelt stehen zu haben.....

Union 19. Jul 2007 10:58

Re: Lokale Varaiablen bei der Deklaration initialisieren
 
Die frühe Initialisierung von Variablen beeinträchtigt allerdings die Wartbarkeit. Man sollte die Zugriffe auf Variablen generell bündeln. Wenn Du eine solchermassen im Funktionskopf initialiserte Variable erst sehr viel später (weiter unten) benutzt, hast Du den ursprünglich zugewiesenen Wert nicht im Blick, musst blättern usw.

Gefährlich kann dies auch sein, wenn nachträglich eine äußere Schleife eingeführt wird. Dann passiert die Initialisierung nämlich ohne weitere Änderungen nur einmal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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