Initialisierungswerte von Variablen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Initialisierungswerte von Variablen

Beitrag von RSE »

Hallo!

Welcher Typ von Variablen wird eigentlich standardmäßig mit welchen Werten initialisiert vom Compiler?

Falls initialisiert wird, nehme ich mal an, dass folgende Werte benutzt werden (bitte um Bestätigung!):
Ordinale Typen: 0 (null)
Realtypen: 0.0 (null komma nix)
Boolean: False
Strings: '' (Leerstring)
Zeigertypen (auch Objekte): nil

Wann wird initialisiert?
  • globale Variablen?
  • lokale Variablen?
  • Variablen in strukturierten Typen (records, Klassen/Objekte)?
  • Arrays?
Gibt es noch weitere andere Vorkommen von Variablen?

Diese nformationen vermisse (oder übersehe??) ich im FPC Reference Guide.
Zuletzt geändert von RSE am Fr 16. Okt 2009, 16:23, insgesamt 1-mal geändert.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10948
Registriert: Mo 11. Sep 2006, 19:01

Re: Initialisierungswerte von Variablen

Beitrag von theo »

Ich kann dir nur eins sagen: Vorsicht!
Habe erst neulich einen hartnäckigen Bug im JanSQL Port beseitigt, der eine falsche Annahme gemacht hat (funktionierte "zufällig" in Delphi).
Lokale boolsche Variablen sind jedenfalls unbestimmt.

S.a: http://www.mail-archive.com/fpc-devel@l ... 14738.html" onclick="window.open(this.href);return false;
http://www.mail-archive.com/fpc-devel@l ... 14742.html" onclick="window.open(this.href);return false;
Zuletzt geändert von theo am Fr 16. Okt 2009, 11:59, insgesamt 1-mal geändert.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Initialisierungswerte von Variablen

Beitrag von monta »

Also meiner Meinung nach sollte man sich nie auf eine initialisierung des FPC bei Zahlen verlassen. Und es gibt meiner Meinung nach auch keine.
Das Einzige, worauf man sich wohl verlassen kann, ist, das ein neuer String leer ist, was wohl aber auch damit zusammenhängt, das er keine gesetzte Länge hat, solange nichts zugewiesen wurde.
Der Rest sind, bspw. bei Integer, Zufallszahlen.
Johannes

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Initialisierungswerte von Variablen

Beitrag von RSE »

Ich hab schon mal irgendwo gelesen, was wann initialisiert wird und was nicht, finde es aber nicht mehr. Daher wäre es eben sinnvoll diese Regeln mal im FPC Reference Guide mit aufzunehmen. Aber das muss einer der Dev´s mal machen.

Edit:
Mir geht´s aktuell jetzt um die Initialisierung der Felder (Variablen) in einer Klasse. Die sind bei den LCL-Klassen nämlich zumindest nicht im Constructor allesamt initialisiert.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10948
Registriert: Mo 11. Sep 2006, 19:01

Re: Initialisierungswerte von Variablen

Beitrag von theo »

Hab mal gegoogelt. In Delphi ist es so:

-Object fields are always initialized to 0, 0.0, '', False, nil or whatever applies.
-Global variables are always initialized.
-Local variables are unitialized so you have to assign a value before you can use them.

Wird mit FPC nicht anders sein.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Initialisierungswerte von Variablen

Beitrag von RSE »

Klingt wie das, was ich da mal gefunden hatte... war also für Delphi, deshalb hatt ich´s nicht wiedergefunden. Ich würd allerdings nicht drauf bauen, dass es der FPC-Compiler genauso handhabt, daher wär mir mal eine definitive Aufstellung für den FPC lieb. Dann würden hier alle mal wissen, wie´s denn tatsächlich läuft, anstatt auf Verdacht immer alles selbst noch mal zu initialisieren.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10948
Registriert: Mo 11. Sep 2006, 19:01

Re: Initialisierungswerte von Variablen

Beitrag von theo »

Ich denke das stimmt schon so auch 100% für FPC.
Du siehst ja auch, dass der Compiler keine Warnung ausgibt bei Klassenfeldern oder globalen Variablen. Bei lokalen hingegen schon.
Und wenn sie schon initialisiert sind, mit was sonst als mit 0, 0.0, '', nil, false etc. ?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Initialisierungswerte von Variablen

Beitrag von pluto »

Also bei mir waren Intereger oder Real Variablen selten mit 0 Installisiert. Ob Local oder Gobale. Da ist wie schon mehrmals gesagt, vorsichtgeboten. Am einfachsten ist alles was angelegt wird auch zu Installisieren, dann gibt es keine Fehler.
MFG
Michael Springwald

Dets
Beiträge: 61
Registriert: Di 11. Sep 2007, 16:59
OS, Lazarus, FPC: Ubuntu Maverick (L 0.9.28.2-10, FPC 2.4.0)
CPU-Target: 32Bit
Wohnort: Lage
Kontaktdaten:

Re: Initialisierungswerte von Variablen

Beitrag von Dets »

Warum lange rumrätseln? Das

Code: Alles auswählen

var
  i: integer;
begin
  ShowMessage(IntToStr(i));
end;
liefert bei mir das Ergebnis: -1207044148
:idea: Dets ...

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Initialisierungswerte von Variablen

Beitrag von RSE »

Damit wäre geklärt, dass lokale Variable nicht initialisiert werden. Wenn allerdings mal irgendwo ein initialisiert aussehender Wert rauskommt, dann kann der auch zufällig null sein. Man kann so also nur Nichtinitialisierung nachweisen. Meine Feldvariable ist auch null, aber ist sie tatsächlich auf null initialisiert, kann ich mich darauf verlassen, oder ist sie nur zufällig null?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10948
Registriert: Mo 11. Sep 2006, 19:01

Re: Initialisierungswerte von Variablen

Beitrag von theo »

RSE hat geschrieben:Damit wäre geklärt, dass lokale Variable nicht initialisiert werden. Wenn allerdings mal irgendwo ein initialisiert aussehender Wert rauskommt, dann kann der auch zufällig null sein. Man kann so also nur Nichtinitialisierung nachweisen. Meine Feldvariable ist auch null, aber ist sie tatsächlich auf null initialisiert, kann ich mich darauf verlassen, oder ist sie nur zufällig null?
Hab ich doch hier beantwortet: http://www.lazarusforum.de/viewtopic.php?p=32432#p32432" onclick="window.open(this.href);return false;

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Initialisierungswerte von Variablen

Beitrag von RSE »

"Ich denke schon" klingt halt anders als "ich bin mir sicher"...
Weißt du es nun genau, oder vermutest du mit hoher Wahrscheinlichkeit? Würdest du es bei "komischen" Fehlern in Frage stellen, oder bist du dir sicher, dass sie so initialisiert werden, wie du geschrieben hast?
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 10948
Registriert: Mo 11. Sep 2006, 19:01

Re: Initialisierungswerte von Variablen

Beitrag von theo »

Was heisst sicher?
Ich würde sagen: Wenn es nicht so ist, wie ich es beschrieben habe, dann ist es ein Bug.
Dass der Kompiler nur bei lokalen Variablen Warnungen ausgibt, ist ein starkes Indiz dass es sich wie bei Delphi verhält.
Dass die Variablen absichtlich mit was anderem als 0,0.0,nil,'',false initialisiert würden, wäre unlogisch und inkompatibel.

Ich will dir aber nicht davon abraten, die Variablen selber zu initialisieren.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Initialisierungswerte von Variablen

Beitrag von RSE »

Dass der Kompiler nur bei lokalen Variablen Warnungen ausgibt, ist ein starkes Indiz dass es sich wie bei Delphi verhält.
Das ist allerdings richtig! Ergo geh ich mal einfach davon aus, dass es sich so verhält und initialisiere nicht nochmal. Dass die Felder in den Konstruktoren der LCL-Klassen auch nicht initialisiert werden, ist ja ein weiteres Indiz für die Richtigkeit der Annahme.
Dass die Variablen absichtlich mit was anderem als 0,0.0,nil,'',false initialisiert würden, wäre unlogisch und inkompatibel.
Das hätte ich auch nicht vermutet, hab das nur hingeschrieben, damit es komplett ist ;-)
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6873
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Initialisierungswerte von Variablen

Beitrag von af0815 »

Das Verhalten des FPCs beim initialisieren ist in der Dokumentation erklärt, Kapitel 4.4
Auszug:

Code: Alles auswählen

By default, variables in pascal are not initialized after their declaration. Any assumption that they contain 0 or any other default value is erroneous: They can contain rubbish.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten