Autor Beitrag
Delphianer23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 156



BeitragVerfasst: Mi 19.02.03 20:28 
[Warning] Unit1.pas(723): Variable 'b' might not have been initialized
[Warning] Unit1.pas(867): Variable 'speich' might not have been initialized

solche warnings kennt wohl jeder, die nerfen mich einfach.

Ist ist bei meinen Prog zu 100% gesichert, dass die Datei, wenn sie benutzt wird vorher initi. wird. Soll ich sie wirklich einfach so (nutzlos) vorher inizialisieren, damit die warning nicht mehr erscheint?

(Warnings machen nen schlechten Eindruck)

Moderiert von user profile iconTino: Absätze entfernt.


Zuletzt bearbeitet von Delphianer23 am Do 20.02.03 16:46, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 19.02.03 20:38 
Das kommt auf den Einzelfall an:
wenn Du beispielsweise eine Integervariable in einer FOR-DO-Schleife verwendest, musst Du sie natürlich nicht initialisieren. Aber in vielen Fällen ist ganz einfach sicherer oder notwendig, das zu tun.
Und es sollte immer gelten: besser einmal zu viel initialisiert als einmal zu wenig.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Mi 19.02.03 20:47 
Hallo,

wenn der Compiler das anmault, dann hat es schon einen Sinn. Dies kommt vor allem dann vor, wenn die Variablen in if- oder case-Bedingungen benutzt werden. Dies soll darauf hindeuten, dass eine Bedingung eintreten kann, bei der die Variable u.U. keinen Wert besitzt. In den meisten Fällen erkennt man dann auch warum.

Die andere Seite ist ja die, wenn man eine überflüssige Zuweisung macht, dass der Compiler auch dies bemängelt.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Delphianer23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 156



BeitragVerfasst: Mi 19.02.03 20:54 
in meinenm fall ist es nur so , wenn die Variable verwendet wird wird sie "besetzt" mit einer bestimmten Sache. und dann gehts weiter. Da das ganze aber in ner if schleife zusammenhängt, gibt der die warning raus. Es ist also zu 100% sicher, dass die Variable, wenn sie VERWENDET wird im gleichen "Strang " auch "besetzt" wird.

Es sträubt sich also in mir unnütz Resourcen zu verbrauchen, obwohl diese so gering sind. Delphi macht da nen Fehler, es müsste prüfen, ob die Variable nur dann verwendet wird, wenn sie auch inizilisiert wird. (Natürlich nur bei lokalen Variablen und keinen Rückgabewerten, da das andere für den Programmier sowieso zu unübsichtlich ist und man lieber inizili.) inizielisiert)

Moderiert von user profile iconTino: Absätze entfernt.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 19.02.03 21:49 
Hi,

Zitat:
Es ist also zu 100% sicher, dass die Variable, wenn sie VERWENDET wird im gleichen "Strang " auch "besetzt" wird.


Diese Aussage ist der klassische Fall für einen "Bug". Genau so entstehen die. NICHTS ist 100 % sicher. Was ist denn, wenn Deine Schleife etwas verschoben wird, z.B. durch eine nachträgliche Abfrage ? Dann krachts nämlich, wenn Du trotzdem später noch auf einen dann vielleicht uninitialisierten Wert zugreifst. Das wird dann allerdings tatsächlich irgendwann mal 100%ig passieren. 8) "Weniger ist mehr" gilt hier nun wirklich nicht.

_________________
Gruß
Hansa
Delphianer23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 156



BeitragVerfasst: Mi 19.02.03 22:10 
Das setzt natürlich vorraus, dass ich nachträglich was ändere und meinen Code nicht mehr überblicke. Das kann ich mir bei meinen 10 Zeilen halt nicht vorstellen. Ihr habt aber schon recht, vor allem wenn man in Teams arbeitet oder sehr alte Projekte mal wieder verwenden will, sollte man auf die "Änderungssicherheit" bedacht sein.

Für das konkrete Projekt, also die konkrete Version ist dies allerdings nicht so.

Man könnte z.B auch durch "//Achtung, Wert nicht init. Schleifenreihenfolge beachten" kennzeichnen.

Moderiert von user profile iconTino: Absätze entfernt.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 19.02.03 22:36 
Ich hab bis jetzt nur ein einziges mal erlebt, daß der Compiler das was ich gemacht habe mißverstanden hat. Früher haben mich diese Hinweise und Warnungen auch nur gestört. Ich war mir sicher, daß ich da keine Fehler gemacht habe. Alles sah immer fehlerlos aus. Irgendwann hab ich mich drangesetzt und, damit der Compiler endlich Ruhe gibt, die Sachen überprüft. Ih hab gemerkt, daß der Compiler schon wuste wieso er die Hinweise ausgegeben hat. Such also lange genug und du wirst die Fehler finden. Ich für meinenTeil habe nichts gegen die Hinweise, denn sie sorgen dafür das ich eventuelle Fehler beseitige.

Of sieht man die Fehler nicht, sie sind aber da:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function DeleteFile2(FileName: String): Boolean;
begin
  if not FileExists(FileName) then Exit;

  Result := DeleteFile(FileName);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if DeleteFile2('c:\test.txt') then ShowMessage( 'Gelöscht' );
end;


Die Message Meldung bei mir sagt übrigens immer "Gelöscht", auch wenn die Datei nicht mehr da ist.
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mi 19.02.03 22:46 
Popov hat folgendes geschrieben:
Die Message Meldung bei mir sagt übrigens immer "Gelöscht", auch wenn die Datei nicht mehr da ist.

Das ist aber reiner Zufall und liegt nur daran, dass True als <> 0 definiert ist. Und die Change das gerade eine 0 an der Stelle, an der Result liegt, steht ist sehr gering, aber nicht unwahrscheinlich.

_________________
Ist Zeit wirklich Geld?
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 19.02.03 23:05 
@Popov : Geht das nicht einfacher so ?

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function DeleteFile2(FileName: String): Boolean; 
begin 
  DeleteFile2 := DeleteFile(FileName); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if DeleteFile2('c:\test.txt') then 
    ShowMessage( 'Gelöscht' ); 
end;


Aber das mit dem Exit und Result ist wieder sowas, wie mit der Initialisierung. Lesbarer wird es dadurch nicht, eher fehleranfälliger. Diese beiden Wörter sind in einem Programm von mir jedenfalls nicht zu finden.

_________________
Gruß
Hansa
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 19.02.03 23:43 
Mir ist auch klar, daß man das besser machen könnte. Das war auch nicht der Sinn des Beispiels. Ich wollte nur zeigen, daß man glauben kann, daß das Result eindeutig ist. Bei der zwei Zeilen sieht man das vielleicht noch. Bei 40 Zeilen könnte das schon etwas unübersichtlicher sein. Eine fehlerfreie Funktion in die man vielleich noch mal schnell eine Abfrage mit Exit einbaut. Schon ist Result nicht eindeutig.

Also jetzt nicht auf das Tunig der Funktion konzentrieren. Das Beispiel ist extra so konstuiert. Es soll einen nicht fehlerfreie Funktion sein.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 20.02.03 01:29 
jaja, das Beispiel ist ja auch gut so. Wo ich das da lese, fällt mir ein, was ich eigentlich ausdrücken wollte und warum ich auf Exit usw. verzichte. Selbst wenn ich alles richtig initialisiere ist das keine Garantie dafür, daß ein gültiger Rückgabewert drin steht :!: Mit Exit wird die procedure vor deren Ende verlassen. D.h. die wird bis irgendwo ausgeführt und dann eben nicht mehr. Das ist dann so eine Art Ersatz von GOTO in Basic. Früher hatte ich auch gerne Exit benutzt, geht schon einfacher, als noch eine lokale Hilfsvariable zu benutzen, aber dann habe ich gemerkt, daß es viele Fehlerquellen produziert hat. Im Endeffekt schreibe ich lieber eine Zeile mehr Code und verzichte darauf.

Da fällt mir noch folgendes ein : Es gibt Programmiersprachen, bei denen die Initial. aller Variablen zwingend gefordert wird, sonst wird nix compiliert. Glaube ADA gehört dazu. Sehr pascal-ähnlich, nur strenger.

_________________
Gruß
Hansa
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 20.02.03 15:25 
Hi!

Zitat:
Selbst wenn ich alles richtig initialisiere ist das keine Garantie dafür, daß ein gültiger Rückgabewert drin steht


Ich glaube, das solltest du näher erklären... Was ist für dich gültig? Wenn du alles initialisierst (so etwas tut man natürlich vor dem ersten Exit-Aufruf), wie sollte plötzlich durch Verwendung des Exits ein undefinierter Rückgabewert entstehen?
Ich persönlich benutze Exit sehr häufig, gerade weil es viel übersichtlicher (und daher weniger fehleranfällig) ist als dauernd Abbruchbedingungen in 50 verschachtelten Schleifen einzusetzen.

Ich kann mich Popovs Meinung nur anschliessen: Der Compiler weiss, was er sagt, auch wenn wir es manchmal nicht sofort verstehen. :wink:

Cu, :)
Udontknow
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 20.02.03 16:37 
Hi,

also manchmal nerven mich diese Meldungen ja auch... zum glück verschwinden die immer wenn man 5-6x auf STRG+F9 drückt :twisted:

Mal nen Beispiel...:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
const
  Version: 'DEMO';

[...]

procedure CheckVersion;
var
  x: Integer;
begin
  if Version='DEMO' then
    x:=1
  else if Version='FULL' then
    x:=2
  [...]
end;

Das ergibt die Warnung das X nicht initialisiert sein könnte... gut, ich könnte jetzt nen Else reinmachen und so.. aber is halt nur nen beispiel :)

Au'revoir,
Aya

_________________
Aya
I aim for my endless dreams and I know they will come true!
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 20.02.03 16:46 
Hallo,

um euch ein wenig Hoffnung zu machen: Ab Delphi 7 Kann man Warnungen und Hinweise sowohl generell als auch einzeln abschalten.

Im allgemeinen finde ich diese aber Praktisch. Sie helfen einen Sauberer zu Programmieren.

Gruß
Klabautermann
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 20.02.03 16:49 
Klabautermann hat folgendes geschrieben:
Im allgemeinen finde ich diese aber Praktisch. Sie helfen einen Sauberer zu Programmieren.

Jep, klar...
Aber irgendwie nervts wenn man unten in dem Error-Fenster immer erst runter/hoch scrollen muß, bis man zu den wichtigen fehlermeldungen kommt *g*

_________________
Aya
I aim for my endless dreams and I know they will come true!
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Do 20.02.03 18:37 
Dann musst du eben dafür sorgen, dass keine Warnungen auftreten, so wie es in all meinen Projekten der Fall ist.
In einer Newsgroup zu Delphi hat mal einer gefragt, warum das Kompilieren seiner Anwendung fast 1 Stunde dauert. Als dann herauskam, dass er ca. 8000 Hinweise und Warnungen bekam, war alles klar. Nach 2 Tagen meldete er sich wieder und verkünderte, dass es nun ca. 30 Sekunden dauert, er aber einige Zeit beschäftigt gewesen sein, alle Warnungen und Hinweise zu beachten.

_________________
Ist Zeit wirklich Geld?
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 20.02.03 18:40 
Was soll ich denn gegen diese Fehlermeldung machen...??
Delphi 6 hat folgendes geschrieben:
[Warning] Unit1.pas(7): Unit 'ShellCtrls' is specific to a platform

Au'revoir,
Aya

_________________
Aya
I aim for my endless dreams and I know they will come true!
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 20.02.03 19:05 
Hab ich das da geschrieben ? Glaube ja. 8)

Udontknow hat folgendes geschrieben:
ich glaube, das solltest du näher erklären... Was ist für dich gültig? Wenn du alles initialisierst (so etwas tut man natürlich vor dem ersten Exit-Aufruf), wie sollte plötzlich durch Verwendung des Exits ein undefinierter Rückgabewert entstehen?


@AYA : ich modifiziere mal Deinen Quelltext etwas:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
const 
  Version: 'DEMOO';  // <--------- z.B. Tastatur prellt, Tippfehler usw.

procedure CheckVersion; 
var 
  x: Integer; 
begin 
  if Version='DEMO' then begin
    x:=1;
    EXIT;
  END;
  else if Version='FULL' then begin
    x:=2 
    EXIT;
  end;
end;


Was steht dann in Result :?:

und was wäre wenn es so wäre :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure CheckVersion; 
var 
  x: Integer; 
begin 
  x := 0;
  if Version='DEMO' then 
    x:=1
  else if Version='FULL' then 
    x:=2 
  end;
end;


Was ist nun besser, da bitte ich aber nun auch um Aufklärung. Bei AYAs Bsp. ist die Variable aber sowieso nicht initialisiert, ob mit oder ohne EXIT.

_________________
Gruß
Hansa
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Do 20.02.03 20:08 
Aya hat folgendes geschrieben:
Was soll ich denn gegen diese Fehlermeldung machen...??
Delphi 6 hat folgendes geschrieben:
[Warning] Unit1.pas(7): Unit 'ShellCtrls' is specific to a platform


Windows benutzen *g*
Die Fehelrmeldung sagt, daß die besagte Unit nur für eine bestimmte Platformart zu benutzen ist.Vermutlich hast du versucht, sie in ein CLX-Programm einzubinden.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 20.02.03 20:11 
Was die fehlermeldung mir sagen will is mir klar *g*

die meldung bekommt ihr, wenn ihr von dem "Samples"-Reiter z.B. den TShellTreeView o.ä benutzt...

und es ging ja hier darum alle Fehlermeldungen wegzubekommen, und bei der hab ich KA wie ich sie wegbekommen soll ;)

_________________
Aya
I aim for my endless dreams and I know they will come true!