Sollten alle Variablen einen Anfangswert bekommen?
-
- Beiträge: 25
- Registriert: Mi 12. Sep 2007, 19:28
Sollten alle Variablen einen Anfangswert bekommen?
Mich wundert es ein wenig, dass Lazarus beim Kompilieren manchmal darauf hinweist, dass z.B. ein einfacher String im Quelltext nicht initialisiert wurde. Darunter verstehe ich, der Variablen einen Wert zuzuweisen, womöglich schon in der Deklaration.
Meine Frage ist nun, ob alle (oder wenn nicht alle, welche dann bzw. welche nicht) Variablen grundsätzlich erstmal gar keinen Wert haben und es daher Probleme geben könnte und wie man damit umgehen sollte.
Und die spezielle Frage, die mich in diesem Zusammenhang beschäftigt: Welchen Wert hat der Boolean einer Funktion, die Boolean zurückliefern soll, zu Anfang? Denn ich weiß immer nicht, ob es jeweils nötig ist, den Boolean am Ende der Funktion auf True oder auf False zu setzen. Eines von beiden ist vielleicht unnötig.
Meine Frage ist nun, ob alle (oder wenn nicht alle, welche dann bzw. welche nicht) Variablen grundsätzlich erstmal gar keinen Wert haben und es daher Probleme geben könnte und wie man damit umgehen sollte.
Und die spezielle Frage, die mich in diesem Zusammenhang beschäftigt: Welchen Wert hat der Boolean einer Funktion, die Boolean zurückliefern soll, zu Anfang? Denn ich weiß immer nicht, ob es jeweils nötig ist, den Boolean am Ende der Funktion auf True oder auf False zu setzen. Eines von beiden ist vielleicht unnötig.
Re: Sollten alle Variablen einen Anfangswert bekommen?
Ist doch klar, er zeigt dir an wenn eine Variable überhaupt nicht benutzt wird. Benutzt man sie nicht kostet sie mehr oder weniger nur rechenleistung. Und das ist unnötig.Gustav Gans hat geschrieben:Mich wundert es ein wenig, dass Lazarus beim Kompilieren manchmal darauf hinweist, dass z.B. ein einfacher String im Quelltext nicht initialisiert wurde. Darunter verstehe ich, der Variablen einen Wert zuzuweisen, womöglich schon in der Deklaration.
Ich sag nur probieren geht über studieren. Das ist ne Sache die man selber rausfinden sollte, da man da am meisten lernt.Gustav Gans hat geschrieben: Meine Frage ist nun, ob alle (oder wenn nicht alle, welche dann bzw. welche nicht) Variablen grundsätzlich erstmal gar keinen Wert haben und es daher Probleme geben könnte und wie man damit umgehen sollte.
Und die spezielle Frage, die mich in diesem Zusammenhang beschäftigt: Welchen Wert hat der Boolean einer Funktion, die Boolean zurückliefern soll, zu Anfang? Denn ich weiß immer nicht, ob es jeweils nötig ist, den Boolean am Ende der Funktion auf True oder auf False zu setzen. Eines von beiden ist vielleicht unnötig.

John
-
- Beiträge: 25
- Registriert: Mi 12. Sep 2007, 19:28
- af0815
- Lazarusforum e. V.
- Beiträge: 6762
- 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:
Faustregel: Wenn Du eine Variable abfragst, dann MUSST du ihr einen Wert irgendwo vorher explizit zugewiesen haben.Gustav Gans hat geschrieben:Das Nichtbenutzen zeigt er an, aber das ist dann eine andere Meldung. So ganz klar ist mir das nicht...
Welchen Wert haben Strings denn zu Beginn immer?
Bei der Funktion kam eben beim Testen TRUE heraus. Also hat eine Funktion immer TRUE?
Alles andere wäre sinnlos, denn der Anfangswert ist als nicht bestimmt anzunehmen. Ein Problem kann nur dann entstehen wenn die Zuweisung durch einen try.. finally oder try..except Block im Fehlerfall unterlassen worden ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Sollten alle Variablen einen Anfangswert bekommen?
Auf die Frage des Themas von mir: Ein eindeutiges JA!
Variablen sollten IMMER vordefiniert sein. Ansonsten können ganz merkwürdige Sachen passieren (z.B. Division durch 0; Rekursion --> Endlosschleife, juhu!)
Gruß, Euklid
Variablen sollten IMMER vordefiniert sein. Ansonsten können ganz merkwürdige Sachen passieren (z.B. Division durch 0; Rekursion --> Endlosschleife, juhu!)
Es kommt natürlich drauf an, wie komplex dein Projekt einmal wird. Eine richtige Initialisierung wird dir gerade bei größeren Projekten beim debuggen zugute kommen.Gustav Gans hat geschrieben:Mich wundert es ein wenig, dass Lazarus beim Kompilieren manchmal darauf hinweist, dass z.B. ein einfacher String im Quelltext nicht initialisiert wurde. Darunter verstehe ich, der Variablen einen Wert zuzuweisen, womöglich schon in der Deklaration.
Gruß, Euklid
-
- 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)
mich hat das schon mehrer tage gekostet einen Fehler zu finden der genau auf dieses Problem zurückzuführen war:
Ich glaube ich hatte eine Boolean wert nicht installisiert.
z.b. wenn ich eine TBitmap variable auf nil prüfen möchte muss sie ja auch umbedingt mit nil belegt werden.
Ich habe hier oder in der DP mal gelesen, das es nicht notwendig ist eine Variable zu Installisieren da das Delphi oder FPC selbst macht, stimmt in den meisten fählen nur nicht.
Also ich würde dir und allen anderen Raten einfach alle Variablen zu Installisieren egal ob es ein String oder ein Integer ist oder auch eine Klasse. Wenn du sie mit einem wert belegst bist du auf der sicheren seite.
Du kannst übrings auch diese Hinweise auf nicht benutze Variablen abschalten da sie manchemal etwas übertrieben sind z.b. bei sowas hier:
MenuItem1Click(Sender:TObject)
was ist wenn du sender hier nicht braucht ?
Dann wird meine ich auch ein Hinweis ausgeben.
Ich glaube ich hatte eine Boolean wert nicht installisiert.
z.b. wenn ich eine TBitmap variable auf nil prüfen möchte muss sie ja auch umbedingt mit nil belegt werden.
Ich habe hier oder in der DP mal gelesen, das es nicht notwendig ist eine Variable zu Installisieren da das Delphi oder FPC selbst macht, stimmt in den meisten fählen nur nicht.
Also ich würde dir und allen anderen Raten einfach alle Variablen zu Installisieren egal ob es ein String oder ein Integer ist oder auch eine Klasse. Wenn du sie mit einem wert belegst bist du auf der sicheren seite.
Du kannst übrings auch diese Hinweise auf nicht benutze Variablen abschalten da sie manchemal etwas übertrieben sind z.b. bei sowas hier:
MenuItem1Click(Sender:TObject)
was ist wenn du sender hier nicht braucht ?
Dann wird meine ich auch ein Hinweis ausgeben.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Eine Bitmap ist keine Variable sondern ein Objektz.b. wenn ich eine TBitmap variable auf nil prüfen möchte muss sie ja auch umbedingt mit nil belegt werden.
Variablen müssen immer initialisiert werden wenn du einen bestimmten wert davon erwartest ist glaub ich sogar in jeder sprache so jedenfalls in c/c++ und pascalIch habe hier oder in der DP mal gelesen, das es nicht notwendig ist eine Variable zu Installisieren da das Delphi oder FPC selbst macht, stimmt in den meisten fählen nur nicht.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- 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)
Naja, wenn das so ist...
wenn ich aber ein Variable von Typ TBitmap habe ist es doch auch eine Variable:
z.b.
bmp:TBitMap;
bmp ist jetzt eine Variable und zugleich ein Object oder besser gesagt eine Klasse.
wo hingegen:
str:String
auch eine einfache Variable aber letzendlich auch ein Object wiederum ist.
(zumindenstes interen)
ein Integer ist glaube ich eine einfache Variable
wenn ich aber ein Variable von Typ TBitmap habe ist es doch auch eine Variable:
z.b.
bmp:TBitMap;
bmp ist jetzt eine Variable und zugleich ein Object oder besser gesagt eine Klasse.
wo hingegen:
str:String
auch eine einfache Variable aber letzendlich auch ein Object wiederum ist.
(zumindenstes interen)
ein Integer ist glaube ich eine einfache Variable
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Wirklich ?!?!?af0815 hat geschrieben:Faustregel: Wenn Du eine Variable abfragst, dann MUSST du ihr einen Wert irgendwo vorher explizit zugewiesen haben.
In ANSI C werden Variablen auf 0 vorbesetzt (außer in bestimmten Ausnahmefällen).
In ObjectPascal ist das m.E. nach auch so:
Automatisch vorbesetzte numerische Variablen werden 0, Pionter NIL (damit Instanz-Variablen "not assiggned()" ), Strings werden Leerstring (''), Dynamische Arrays bekommen Length=0, Aufzählungstypen den "ersten" Wert, ...
Automatisch vorbesetzt werden globale Variablen beim Programmstart und Klassenvariablen beim "create", nicht aber lokale Variablen in Unterprogrammen. (Bei Strings als lokale Variable bin ich mir nicht sicher.)
Z.B., Dass bisher nicht verwendete globale Instanz-Variablen "not assigned()" sind, wird regelmäßig überall verwendet.
-Michael
- af0815
- Lazarusforum e. V.
- Beiträge: 6762
- 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:
Ich habe es noch nicht DOKUMENTIERT gefunden, das es beim FPC/Lazarus auch so ist. Somit ist einmal bis zur Klärung davon auszugehen, das es nicht so ist.mschnell hat geschrieben:Wirklich ?!?!?af0815 hat geschrieben:Faustregel: Wenn Du eine Variable abfragst, dann MUSST du ihr einen Wert irgendwo vorher explizit zugewiesen haben.
In ANSI C werden Variablen auf 0 vorbesetzt (außer in bestimmten Ausnahmefällen).
In ObjectPascal ist das m.E. nach auch so:
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).