Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   possible use of uninitialized variable (http://www.expert-advisor.com/forum/showthread.php?t=6057)

AVT 23.03.18 19:39

possible use of uninitialized variable
 
Ich habe ein Verständnisproblem, warum ich die Warnung
"possible use of uninitialized variable 'Factor' " für folgenden Codeaufbau bekomme, und zwar für die rote Zeile:
Code:

// head
int a;          // used everywhere in several functions
double FinalVal;
// end head

Func()
{
  if(Condition)
  {
      int Factor;
      if(Cond1)      Factor=2;
      else if(Cond2) Factor=3;
      // more code for a and Variable calc
      FinalVal=NormalizeDouble(a*Variable*Factor,2);
  }
}

Factor wird ausschließlich in Func() gebraucht, also gehört es da rein und nicht in den Head (steht es da, ist die Warnung weg) und es wird auch nur gebraucht, wenn die Bedingung true ist, also gehört es da rein und nicht an den Anfang der Func(). Und auch wenn dazwischen 1000 Zeilen Code stehen, bevor FinalVal kommt, das Ding ist initialized und ich verstehe nicht, warum ich ne Warnung kriege. Kann mich da vielleicht mal jemand erleuchten.
Danke. AVT

Raul0 23.03.18 22:32

Versuche doch der Variable Faktor einen Erst-Wert zu geben, zB:

PHP-Code:

int Factor 0


next user 24.03.18 06:44

Zitat:

Zitat von AVT (Beitrag 40662)
Und auch wenn dazwischen 1000 Zeilen Code stehen, bevor FinalVal kommt, das Ding ist initialized...

Nicht ganz. Der Compiler sieht da die Deklaration deiner Variablen ohne einen Anfangswert zu definieren.
Sofern eine Variable keinen "echten" Wert zugewiesen bekommt, "erhält" sie einen undefinierten Standardwert.
Einen echten Wert erhält deine Variable aber nur beim Zutreffen einer Bedingung. Wäre da ein "if-else" anstatt "if-else if", so würde
deine Variable in jedem Fall einen echten Wert bekommen.

Also kurz:
Erhält eine Variable nur unter Bedingungen einen Wert, denkt der Compiler sich "die Bedingungen können auch NICHT zutreffen".
Eine weitere Nutzung einer solchen Variable lässt den Compiler dann warnen "diese Variable wurde vorher möglicherweise nicht
mit einem Wert gefütter..."

AVT 24.03.18 09:52

Ich danke Euch, Raul0 und next user.
Zitat:

Zitat von next user (Beitrag 40670)
Nicht ganz. Der Compiler sieht da die Deklaration deiner Variablen ohne einen Anfangswert zu definieren.
Sofern eine Variable keinen "echten" Wert zugewiesen bekommt, "erhält" sie einen undefinierten Standardwert.

:) declaration != initialization
Zitat:

Zitat von next user (Beitrag 40670)
Wäre da ein "if-else" anstatt "if-else if", so würde deine Variable in jedem Fall einen echten Wert bekommen..

Jep, die 3. Zeile "else" hatte ich auskommentiert, mein Fehler. Alte Regel "kein if ohne else" (macht zwar den Code manchmal unnötig lang, verhindert aber Fehler) mal wieder mißachtet.
Wer mal die glibc mit allwarnings kompiliert hat, lernt schnell eine Warnung ist eine Warnung und kein Fehler, aber ich hab's lieber ohne Warnungen im strict Modus. AVT

next user 24.03.18 19:35

Zitat:

Zitat von AVT (Beitrag 40672)
:) declaration != initialization

Hi,

mir sind die Unterschiede zwischen Deklaration, Definition, Initialisierung ect. bekannt.
Deine Anmerkung passt allerdings nicht zu meinen Sätzen. Du musst diese schon zusammen betrachten.
Besonders im ersten Satz von mir "umschreibe" ich da KEINE Deklaration mit einer Initialisierung, aber ist ja auch egal... :)

Zitat:

Zitat von AVT (Beitrag 40672)
... aber ich hab's lieber ohne Warnungen im strict Modus.

Geht mir genauso.

AVT 24.03.18 22:56

Zitat:

Zitat von next user (Beitrag 40687)
mir sind die Unterschiede zwischen Deklaration, Definition, Initialisierung ect. bekannt.

Aber mir anscheinend nicht genug! Und ich hatte Dich so verstanden, daß eine "int a;" eben nur eine Deklaration ist, die besagt daß ich mal ein a vom integer Typ benutzen will - und erst mit "a=1;" eine Intialisierung draus wird, die sagt nun laß uns mal konkret bei 1 anfangen mit der a Benutzung.
Für mich war ursprünglich die Initialisierung mit "int a;" abgeschlossen und nun habe ich als Fazit im Lernspeicher: Achtung ist nicht dasselbe.
Zitat:

Zitat von next user (Beitrag 40687)
aber ist ja auch egal... :)

Speicher kann man auch wieder freigeben, wenn's sein muß ... Schönes Wochenende. AVT

traderdoc 25.03.18 11:02

"Speicher kann man auch wieder freigeben, wenn's sein muß ..."

Das ist mir jetzt etwas zu platt. Welchen Speicher meinst Du?
Da wir hier die ganze Zeit um die Deklaration und Initialisierung einer Integer-Variablen geschrieben haben, erklärst Du mal bitte die Freigabe konkret daran.

Danke.

traderdoc

Ca$hDigger 25.03.18 11:43

Dynamische Speicherverwaltung: new, delete.
Sollte aber nur mit Klassen gehen. Ein einziges int in eine Klasse packen sollte sich nicht lohnen, die 4Byte müsste der RAM verkraften ;)

C$D

traderdoc 25.03.18 12:48

Zitat:

Zitat von Ca$hDigger (Beitrag 40700)
Dynamische Speicherverwaltung: new, delete.
Sollte aber nur mit Klassen gehen. Ein einziges int in eine Klasse packen sollte sich nicht lohnen, die 4Byte müsste der RAM verkraften ;)
C$D

Ne, die dynamische Speicherverwaltung kann er nicht meinen.

traderdoc

Ca$hDigger 25.03.18 16:12

Ein global deklariertes int wie hier lässt sich nicht freigeben, ausser wie genannt es befindet sich in einer dynamischen Struktur wie Klasse oder Array...

Mal davon abgesehen, was sollte der Sinn davon sein, warum sollte man ein einzelnes int mit 4Byte freigeben wollen? :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:42 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum