Problem mit initialisierung von lokaler Variable



  • Hey Leute ,

    Ich hab ein Problem.
    Ich hab eine Device classe geschrieben und will jetzt sie eben init. :

    Device* dev;
    if(!dev){MessageBox(NULL, L"Fehler beim erstellen des Device", L"Error", MB_OK | MB_ICONERROR); pCCEError}
    

    Nun bekomme ich aber einen fehler :

    Die nicht initialisierte lokale Variable "dev" wurde verwendet.
    

    aber mit Device* dev; wird sie doch initialisiert ?!

    Ich hab mal zum test dev auf Null , 0 also FALSE gemacht was heißt dass die Fehlermeldung immer kommen muss was auch geht.

    Nach dem der

    Die nicht initialisierte lokale Variable "dev" wurde verwendet.
    

    Fehler kommt und ich auf Weiter drücke (debug) läuft es aber ganznormal weiter und im release mode geht es auch(warnings halt).

    Weiß irgendeiner was zu machen ist da mir es immer ein dorn im Auge ist wenn ich 10 warnings im log habe

    Danke

    - 7xCore



  • Nein, die Anweisung Device* dev; definiert die Variable nur, aber an der Stelle bekommt sie einen unbestimmten Wert. Initialisiert wird sie erst, wenn du dort einen Wert reinpumpst (entweder Device* dev = NULL; oder sowas wie Device* dev = CreateTheDevice(); ).



  • Ja das mit dem NULL FALSE 0 ... hab ich schon ausprobiert was auch geht aber dann eben immer auf false ist und so kommt immer die fehlermeldung.

    Gerade frag ich mich aber ob es auch einfach geht wenn ich eine leere funktion einfach nehme so wie

    void leer(void);
    
    Device* dev = leer();
    

    😕



  • Nein, eine void-Funktion kannst du so nicht verwenden, die hat ja keinen Rückgabewert. Was du benötigst, ist eine Funktion, die dir ein komplettes Device anlegt und zurückliefert.

    (PS: Ich weiß zwar nicht, was sich hinter "Device" verbirgt, aber möglicherweise kannst du auf den Zeiger verzichten und eine normale Variable Device dev; verwenden)



  • Device* dev;

    Nun hast du einen uninitialisierten Zeiger auf ein Device-Objekt. Der anschließende Test darauf funktioniert erstmal nicht, weil im Zeiger jetzt ein beliebiger Wert stehen kann. Aber selbst wenn du den Zeiger mit 0 oder nullptr initialisiert, ist der anschließende Test sinnlos, weil er dann immer anspringen würde. Entweder du versuchst ein Device-Objekt zu erstellen und weist dem Zeiger dann die Addresse desjenigen Objektes zu oder du sparst dir den anschließenden Test gleich komplett.



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


  • Mod

    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 ?


Anmelden zum Antworten