Problem mit initialisierung von lokaler Variable
-
Hört sich alles besser an was ich so vorhatte.
Ich hab jetzt ein bisschen "rumprobiert" und hab jetzt
Device* create_pDevice(Device*);
Ist natürlich klar das das nicht geht , aber es ist näher als vorher, hoffe ich doch.
Jetzt kann ich schon mal
Device* dev = dev->create_pDevice(dev);
besser verstehen.
(Zu der eig. normalen initialisierung von der klassen instanz ... ich finde klasse* pointer sieht nicht so langweilig wie klasse.instanz aus
was in endeffekt ja egal ist)
Nun denn lasst euren gedanken freien lauf , worum ich bitte , und ich geh jetzt erstmal schlafen.
Danke für eure schnellen postings schonmal und gute nacht
- 7xCore
-
Da ich mich nochnicht von meinem stuhl aufraffen konnte muss ich noch mal einen kommentar abgeben :
Du hast eig. recht dass ich mir den sinnlosen test sparen kann.Aber ich würde den Fehler trotzdem gerne finden für das Verständniss.
-
Das ist eigentlich kein richtiger Fehler (zumindest nicht im Sinne eines Sprachfehlers). Deine freundliche Entwicklungsumgebung macht dich allerdings auf den Umstand aufmerksam, dass du eine Variable auf einen bestimmten Wert testest, der du bislang keinen Wert zugewiesen hast (weder direkt noch indirekt). Das anschließende Verwenden des Wertes dieser Variablen ist dann sozusagen eine nicht-deterministische Aktion. Zu einer Wahrscheinlichkeit von 1/(2^32) wird der Test nicht anspringen, zu einer Wahrscheinlichkeit von (232-1)/(232) wird er das tun.
Alles bezogen auf eine 32Bit-Umgebung.
-
Decimad schrieb:
Zu einer Wahrscheinlichkeit von 1/(2^32) wird der Test nicht anspringen, zu einer Wahrscheinlichkeit von (232-1)/(232) wird er das tun.
Alles bezogen auf eine 32Bit-Umgebung.Entgegen anders lautender Gerüchte sind in der Praxis die Werte uninitialisierter Variabler nicht wirklich zufällig. Da Speicher den dein Programm bekommt bei allen gängigen Betriebssystemen genullt wird, sind die Werte die da stehen Werte die dein Programm vorher benutzt hat (gerne auch nur indirekt über die Laufzeitumgebung). Und falls der Rest des Programm deterministisch ist, ist das immer der gleiche Wert. Bis man an einer ganz anderen Stelle im Programm etwas ändert. Und dann wundert man sich gewaltig.
(Und prinzipiell darf der Compiler bei undefiniertem Verhalten theoretisch alles machen. Zum Beispiel die Prüfung ganz wegoptimieren, was noch viel verwirrender zu debuggen ist.)
-
7xCore schrieb:
Hört sich alles besser an was ich so vorhatte.
Ich hab jetzt ein bisschen "rumprobiert" und hab jetzt
Device* create_pDevice(Device*);
Ist natürlich klar das das nicht geht , aber es ist näher als vorher, hoffe ich doch.
Jetzt kann ich schon mal
Device* dev = dev->create_pDevice(dev);
besser verstehen.
In der letzten Anweisung sind mit Sicherheit einige Erwähnungen von "dev" zu viel. Und die Art, wie du mit Parametern umgehst, ist auch nicht im Sinne des Erfinders.
(Zu der eig. normalen initialisierung von der klassen instanz ... ich finde klasse* pointer sieht nicht so langweilig wie klasse.instanz aus
was in endeffekt ja egal ist)
Also ich habe lieber eine "langweilige", aber dafür korrekte Lösung als etwas instabil zusammengezimmertes.
-
Ahh schön das ihr noch alles was gepostet habt.
Ich bin nun so weit gekommen das ich die warnings umgehen konnte.
Da hat er mir dann gesagt das die funktion einen return wert braucht.
Irgendwie hab ich dann mal so das am ende rausgebracht :Device.h
Device* create_pDevice();
Device.cpp
Device* create_pDevice(Device* pCCEDevice){ return pCCEDevice; }
devicetest.cpp
Device* dev = dev->create_pDevice();
scheint ohne warnings oder fehler im debugmodus zu funktionieren
-
Wie ich gerade merke hat es doch nicht funktioniert , was es ja garnicht kann.
Ich habe nur vergessen die /**/ in Device.h zu entfernen.Nunja ich werde mal weiter probieren und wenn nicht , oder bis da hin werde ich einfach
Device* device = 0;
und den error test deaktivieren
-
Was zur Hölle veranstaltest du da?
Dein Compiler beschwert sich berechtigterweise, dass du eine uninitialisierte Variable benutzt, und du baust Hacks um die Warnung zu unterdrücken.
-
1.Ich hab nun einfach dein
Device
virtual CCEDevice::Device* getDevice() = 0;
hinzugefüg sodass ich nun
Device* lala = lala->getDevice();
machen kann wobei das selbe wie davor rauskommt.
Also bin ich wieder am Anfang :|und du baust Hacks um die Warnung zu unterdrücken.
meinst du brauchst oder baust ? und erläutere das bitte näher
-
Device* lala = lala->getDevice();
Herrje, ist es denn so schwer zu verstehen? Um lala zu inititialisieren willst du lala dereferenzieren (ding ding ding ding *alarm* *alarm* ding ding ding) und getDevice aufrufen. Klingeln da nicht alle Alarmglocken bei dir?
-
Vielleicht solltest du mal ein einführendes C++ Buch lesen.
-
Initialisiere einfach dein Device und gut !
Ob es jetzt ein
Device* dev = new Device;
oder ein
Device* dev = 0;
oder am Besten
Device* dev = CreateDevice(); // CreateDevice ist eine Funktion, die dein Device erzeugt und initialisiert.
ist schnuppe (für den Compiler natürlich nur), danach ist die Warnung weg.
-
Wie schon erwähnt: Wenns nicht nötig ist dein Objekt mit new zu erzeugen, erzeuge es als automatische Variable!
-
manni66 schrieb:
Vielleicht solltest du mal ein einführendes C++ Buch lesen.
Dir scheint grundlegendstes Wissen zu fehlen, so kommst du nicht weit.
-
Device* lala = lala->getDevice();
Herrje, ist es denn so schwer zu verstehen? Um lala zu inititialisieren willst du lala dereferenzieren (ding ding ding ding *alarm* *alarm* ding ding ding) und getDevice aufrufen. Klingeln da nicht alle Alarmglocken bei dir?
Nein sorry.Ich weiß nicht genau was du damit meinst "dereferenzieren"
Der rest mit
dev = 0 , new Device ... geht ja auch alles aber was ich gerne wissen würde , wenn ich den Device durch eine funktion so wie getDevice(),createDevice()... was auch immer wie eben diese funktion getDevice aussieht
Hier z.B.
Device* dev = CreateDevice();
Was enthält nun diese funktion ?
-
Was enthält nun diese funktion ?
Du wirst doch irgendeine Schnittstelle nutzen, die dir dein Device erzeugt? Benutz die.
Oder ist Device etwa von dir geschrieben?
-
Device hab ich selbst geschrieben , deswegen auch die frage
-
dann musst du wissen, wie du dein Device erzeugen kannst.
Lern bitte erstmal C++.
-
Dann ist dein ganzes Vorhaben schwachsinnig.
Erstell dev einfach auf dem Stack, oder bei dynamischer Lebenszeit auf dem Heap.
-
Ja eigentlich passt es mit
Device dev = new Device;