AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Delphi Standard Variablen Initialisierung

Delphi Standard Variablen Initialisierung

Offene Frage von "Stevie"
Ein Thema von NicoDelphiCoder · begonnen am 29. Sep 2022 · letzter Beitrag vom 30. Sep 2022
Antwort Antwort
Seite 1 von 2  1 2   
NicoDelphiCoder

Registriert seit: 29. Sep 2022
4 Beiträge
 
#1

Delphi Standard Variablen Initialisierung

  Alt 29. Sep 2022, 23:31
Delphi-Version: 11 Alexandria
Guten Abend erstmal!

Ich bin neu hier und hoffentlich richtig im richtigen Thread.

Ich habe eine Frage zur lokalen Variablen Initialisierung in Delphi. Ich weiß, dass der default bei lokalen Variablen immer ein „Random“ Wert ist. Je nach dem was gerade an der Speicheradresse liegt, wenn eine lokale Variable deklariert ist.

Bei uns in unserem Projekt ist dies bei der 32 Bit Version aber nicht so. Dort werden alle Variablen mit dem Default-Werten initialisiertet. Objekte mit nil, Integer mit 0 usw. Wenn man in 64 Bit Compiliert ist es das Standardverhalten.

Weiß jemand woran das liegen kann? Habe schon das halbe Internet abgesucht konnte aber nichts finden, was dieses Verhalten beeinfluss. Scheint auch nicht an der Projektdatei zu liegen. Die Compilereinstellungen sind dort in 32 und 64 Bit gleich

Danke schonmal im Voraus!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi Standard Variablen Initialisierung

  Alt 29. Sep 2022, 23:37
Nein, das geht nur bei globalen Variablen.


OK, und neuerdings auch bei Inline-Variablen, also einen "Initalisations-Wert" zu definieren,
und Objekte-Felder oder globaler Variablen sind sonst auch immer 0.



lokale Variablen sind nicht initialisiert, also haben einen zufälligen Wert, aber wenn sie da auf dem Stack liegen, wo vorher noch nichts war, dann ist es "jetzt" auch 0, aber ob auch später ...

Ausnahme sind Managed-Typen, welche eine automatische Speicherverwaltung haben, also Strings, dynamische Arrays, Variants, Interfaces, ... und inzwischen auch Custom-Managed-Records, welchen "du" eine Initialisation spendiert hast.

Und letztendlich ist es egal, da der Compiler dir sagt, wenn die lokale Variable nicht initialisiert ist .... man muß nur auf ihn hören und seinen Fehler beheben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Sep 2022 um 23:42 Uhr)
  Mit Zitat antworten Zitat
NicoDelphiCoder

Registriert seit: 29. Sep 2022
4 Beiträge
 
#3

AW: Delphi Standard Variablen Initialisierung

  Alt 29. Sep 2022, 23:47
Nein, das geht nur bei globalen Variablen.


OK, und neuerdings auch bei Inline-Variablen.
Ich weiß, ich konnte nirgendwo eine Information dazu finden, dass so ein Verhalten unterstützt wird. Aber tatsächlich ist in unserem Hauptprojekt so das Verhalten (nur 32 Bit Version).

Als Hintergrund: Arbeite in der Firma seit 5 Jahren. Seit dem ich dort bin, weiß keiner warum dieses Verhalten bei uns auftritt und suchen nach einer Lösung um das 32 Bit Verhalten, wo alle lokalen Variablen im default initialisiert werden loszuwerden. Oder umgekehrt, dass sich unsere 64 Bit Version so wie die 32 Bit Version verhält. Wir bekommen dadurch oft Fehler, dass sich das Program deswegen in 32 Bit Version anderes Verhält als in der 64 Bit Version. Oder es deswegen Abstürze gibt, weil die lokale Variable in 32 Bit automatisch nil ist und vergessen wurde diese auf nil zu setzten.

Ich weiß, das hört sich verrückt oder unglaubhaft an
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi Standard Variablen Initialisierung

  Alt 29. Sep 2022, 23:50
Nein, abgesehn von Objekten und New/GetMemory/... initialisiert Delphi keinen Speicher und dort auch nur, weil Windows (VirtualAlloc) dort auch immer genullt gibt.

Aus "performancegründen" wird aber der Stack nicht mit 0 überschrieben, bei jedem Funktionsaufruf (außer eben des Gemanagte, weil es dort Ohne nicht funktioniert) .... daaaaaaaaaaaamals waren PCs halt noch schön langsam



Nein, ihr bekommt Abstürze, weil ihr nicht auf das hört, was euch der Compiler sagt/warnt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Sep 2022 um 23:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#5

AW: Delphi Standard Variablen Initialisierung

  Alt 29. Sep 2022, 23:51
Gibt dir denn der Compiler keinen Hinweis auf eine nicht-initialisierte Variable?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Delphi Standard Variablen Initialisierung

  Alt 30. Sep 2022, 05:55
Hallo,
unterscheidet sich die Anzahl der Compilerwarnungen bei 32Bit und 64Bit?
Heiko
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.377 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Delphi Standard Variablen Initialisierung

  Alt 30. Sep 2022, 07:47
metto wegen Compilerwarnungen
Ich weiß, das hört sich verrückt oder unglaubhaft an
Schon... Dann mal ab in Debugger und stürze Dich ins CPU-Fenster. Wenn Du meinst dann muss da ja irgendwo ein Code sein.
  Mit Zitat antworten Zitat
NicoDelphiCoder

Registriert seit: 29. Sep 2022
4 Beiträge
 
#8

AW: Delphi Standard Variablen Initialisierung

  Alt 30. Sep 2022, 09:02
Gibt dir denn der Compiler keinen Hinweis auf eine nicht-initialisierte Variable?
Doch in den meisten Fällen schon, aber z.B. in diesem Fall nicht:

Code:
procedure Test;
var
  MyObject: TMyClass;
begin
  try

  finally
    FreeAndNil(MyObject);
  end;
end;
In dem Falle bekomme ich keine Warnung.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#9

AW: Delphi Standard Variablen Initialisierung

  Alt 30. Sep 2022, 09:13
Das sollte man ja auch besser so schreiben:
Delphi-Quellcode:
procedure Test;
var
  MyObject: TMyClass;
begin
  try

  finally
    MyObject.Free;
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi Standard Variablen Initialisierung

  Alt 30. Sep 2022, 09:41
FreeAndNil sollte aber auch diese Meldung produzieren, wenn vorher nichts zugewiesen wurde.

(außer wenn AUTOREFCOUNT, also in den Mobilen, weil naja ... Objekt ist dort Managed, also immer initialisiert, und diese Inline-Przedur macht auch bloß noch Obj := nil; , was kein Lesezugriff ist ... der Prozedur-Header "CONST" ja, aber INLINE nicht mehr)



Ja, ich kenne auch Viele, die machen einfach (normal) immer und überall grundsätzlich FreeAndNil anstatt nur Free,
auch wenn es eigentlich nicht nötig ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Sep 2022 um 09:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 14:07 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