Sollten alle Variablen einen Anfangswert bekommen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Gustav Gans
Beiträge: 25
Registriert: Mi 12. Sep 2007, 19:28

Sollten alle Variablen einen Anfangswert bekommen?

Beitrag von Gustav Gans »

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.

John
Beiträge: 273
Registriert: Mo 30. Jul 2007, 19:55

Re: Sollten alle Variablen einen Anfangswert bekommen?

Beitrag von John »

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.
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: 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.
Ich sag nur probieren geht über studieren. Das ist ne Sache die man selber rausfinden sollte, da man da am meisten lernt.
:D


John

Gustav Gans
Beiträge: 25
Registriert: Mi 12. Sep 2007, 19:28

Beitrag von Gustav Gans »

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?

Benutzeravatar
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:

Beitrag von af0815 »

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?
Faustregel: Wenn Du eine Variable abfragst, dann MUSST du ihr einen Wert irgendwo vorher explizit zugewiesen haben.

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).

Euklid
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?

Beitrag von Euklid »

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!)
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.
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.

Gruß, Euklid

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)

Beitrag von pluto »

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.
MFG
Michael Springwald

Christian
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:

Beitrag von Christian »

z.b. wenn ich eine TBitmap variable auf nil prüfen möchte muss sie ja auch umbedingt mit nil belegt werden.
Eine Bitmap ist keine Variable sondern ein Objekt
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.
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 pascal
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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)

Beitrag von pluto »

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
MFG
Michael Springwald

mschnell
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

Beitrag von mschnell »

af0815 hat geschrieben:Faustregel: Wenn Du eine Variable abfragst, dann MUSST du ihr einen Wert irgendwo vorher explizit zugewiesen haben.
Wirklich ?!?!?

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

Benutzeravatar
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:

Beitrag von af0815 »

mschnell hat geschrieben:
af0815 hat geschrieben:Faustregel: Wenn Du eine Variable abfragst, dann MUSST du ihr einen Wert irgendwo vorher explizit zugewiesen haben.
Wirklich ?!?!?

In ANSI C werden Variablen auf 0 vorbesetzt (außer in bestimmten Ausnahmefällen).

In ObjectPascal ist das m.E. nach auch so:
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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
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:

Beitrag von Christian »

In ANSI C werden Variablen auf 0 vorbesetzt (außer in bestimmten Ausnahmefällen).
Wenn du 80% aller variablen als ausnamefälle bezeichnest stimmt das.
Alles was ünber den stack geht (also alles ausser globalen variablen) wird nicht initialisiert.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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)

Beitrag von pluto »

Das heißt also es werden nur 20% der variablen Installisiert.... ganz schön wenig.....
MFG
Michael Springwald

Christian
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:

Beitrag von Christian »

Wiso ? es kostet schliesslich auch zeit die Variablen zu initialisieren und bei sicherlich 95% ist das vor initialisieren gar nicht nötig. Ausserdem gibg es hier um C
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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)

Beitrag von pluto »

Aber teilweise am Anfang auch im Pascal
ich würde sagen meine aussage von oben da spielt es keine rolle ob das nun Pascal oder was auch sonst ist.
MFG
Michael Springwald

Christian
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:

Beitrag von Christian »

Pascal initialisiert gar keine Variablen von selbst.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten