Bei CDialog::OnInitDialog(); Variablen deklarieren?
-
Guten Morgen! Ich hab da ein kleines Problem, ist warscheinlich ziemlich simpel, aber ich kann's mir nicht erklären...
Ich habe versucht bei CDialog::OnInitDialog() zwei Variablen zu deklarieren, in die ich später ein paar Werte "auslagern" möchte um damit zu rechen.
Wenn ich das ganze auf einen Button lege (z.B. void CDialogDlg::OnButton1())funktioniert alles wunderbar!
Nur soll der User nicht immer erst irgendwo drauf drücken müssen, nur damit das Programm so funktioniert wie's soll...
Deswegen wollte ich, dass es gleich bei Programmstart passiert...{ CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen double memMAIN_IN; double memMAIN_OUT = NULL; return TRUE; }Kompilierung läuft...
CDialogDlg.cpp
DialogDlg.cpp(66) : warning C4101: 'memMAIN_IN' : Unreferenzierte lokale Variable
DialogDlg.cpp(120) : error C2065: 'memMAIN_IN' : nichtdeklarierter Bezeichner
// Heißt wohl er ignoriert das an dieser Stelle einfach... 
DialogDlg.cpp(120) : warning C4244: '=' : Konvertierung von 'double' in 'int', moeglicher Datenverlust
DialogDlg.cpp(122) : error C2065: 'memMAIN_OUT' : nichtdeklarierter Bezeichner
// ^^ Das gleiche nochmal...
Fehler beim Ausführen von cl.exe.Ich "arbeite" erst seit zwei Wochen mit C++, weil ich das jetzt in der Ausbildung mache.
Bin also totaler newbie! Ich hab zwar schon ein paar C++ Bücher gelesen, aber leider reicht mein Wissen nicht aus um mir das zu erklären.
Vielleicht kann mir ja mal jemand erleutern warum das mit den Variablen so nicht bei OnInit möglich ist... Wäre toll!
Und ein Vorschlag was alternativ möglich wäre (außer nem Button für den User
), bzw. wie man das hier richtig macht, wäre natürlich noch viel toller! THX!
-
Die beiden Variablen, die du da anlegst, sind Funktionslokal. Das heißt, sie existieren nur in der Funktion (bzw. Methode) OnInitDialog. In einer für einen Button zugewiesene Methode zum Beispiel sind sie nicht mehr gültig.
Dazu müssen die Variablen nicht in OnInitDialog deklariert, sondern für die ganze Dialog-Klasse als Membervariablen deklariert werden. Das geht am einfachsen, indem du in der Klassenansicht mit rechts auf den Klassennamen (normalerweise CMyDlg) klickst und "Member-Variable Hinzufügen wählst". Als Zugriffsberechtigung solltest du private oder protected wählen und wenn die Variable von außen verändert werden soll, Get/Set Methoden implementieren.
-
Okay, danke! Das hat funktioniert! Ich dachte es ist egal wo ich die deklariere und das die immer im gesamten Dialog verfügbar wären...
Nun ist hier aber noch was merkwürdiges...
Und zwar...
/* angenommen m_EDIT_IN sei "10" und memMAIN_OUT sei NULL, dann müsste nach meiner Rechnung am Ende memMAIN_OUT auch 10 sein... */ void CCONVERTERDlg::OnButtonAdd() { UpdateData(TRUE) memMAIN_IN = atof(m_EDIT_IN); // Neuen Wert aus Eingabefeld holen memMAIN_OUT = memMAIN_OUT + memMAIN_IN; // Wert zu memMEIN_OUT addieren m_DEBUG_IN = memMAIN_IN; // Hier wird logischerweise 10 ausgegeben... m_DEBUG_OUT = memMAIN_OUT; // Aber hier kommt -9.25596313493178e+061 raus!?! :confused: /* Hat mein Computer in der Grundschule nicht aufgepasst? Ich denke nicht... ;) Also warum zer****** der hier den Wert? 0 + 10 = 10 und nicht -9.25596313493178e+061... */ UpdateData(FALSE); }Das ist jetzt nicht wirklich ein Problem, wenn ich memMAIN_OUT bei OnInit auf NULL setze funktioniert es!

Dennoch muss ich sagen das mich das ziemlich verwirrt...
Hab ich hier wieder irgendwelche Regeln nicht beachtet?Ich hatte ja vermutet das es mit der Konvertierung von ASCII to float zusammen hängt,
aber dann müsste der Wert ja bei memMAIN_IN auch schon so seltsam sein...Ach so, m_DEBUG_IN und m_DEBUG_OUT sind beide vom Typ double!
-
Hallo,
nachdem du die beiden Variablen in der Dialogklasse deklrariert hast, weißt der Compiler Speicher für sie zu. Ohne die Variablen vorher (zum Beispiel in OnInitDialog) mit einem Wert zu versehen, erhalten sie eben den Wert, der an dieser Stelle bereits im Speicher war. Und bei dir war das eben wohl -9.25596313493178e+061.