überschneidet initialisierung



  • hallo,

    ich habe einen mir unerklärlichen compilerfehler:

    main.cpp:126: Fehler: Sprung zur case-Marke
    main.cpp:92: Fehler:   überschneidet Initialisierung von »Matrix<double>* A«
    make: *** [main.o] Fehler 1
    

    Meine main sieht an der stelle so aus:

    switch(o_rm.Get_Matrix_Type(matrix_file))
    			{
    				case real:	
    
    					Matrix<double>	*A = NULL;
     					Read_Matrix_File(matrix_file, &A);
    					break;
    
     				case complex:
     					std::cout << "hier folgt complex " << std::endl;
    					break;		
    
    				//default case will not occur
    			}
    

    wenn ich die ersten zeile im real fall so schreibe: Matrix<double> *A;
    dann klappt es.
    woran liegt das? warum kann ich denn von einer template klasse keinen Null pointer anlegen?



  • Ich bin mir jetzt überhaupt nicht sicher, aber ich meine irgendwo gelesen zu haben, dass man, wenn man in einer switch Variablen anlegen will, diese in einen Block von geschweiften Klammern einschließen muss.



  • tatsächlich 😮
    darauf wäre ich jetzt nie gekommen - DANKE an dieser stelle



  • Tjo muss man ... stimmt schon ... sollte aber geläufig sein ... Erklärung darf dieses mal wer anderes liefern...



  • (D)Evil schrieb:

    Tjo muss man ... stimmt schon ... sollte aber geläufig sein ... Erklärung darf dieses mal wer anderes liefern...

    Nun rück schon raus mit der Sprache 🤡



  • (D)Evil schrieb:

    Tjo muss man ... stimmt schon ... sollte aber geläufig sein ... Erklärung darf dieses mal wer anderes liefern...

    muss man nicht. man kann die variable auch ausserhalb der switch-anweisung anlegen und initialisieren.
    🙂



  • TravisG schrieb:

    Nun rück schon raus mit der Sprache 🤡

    Das Problem wäre einfach, dass die Variable auch "innerhalb" der nachfolgenden case-Marken "ansprechbar" wäre, da man sich immer noch im selben Block (im "Switch-Block") befände. Dass die Variable angelegt und initialisiert werden würden, wäre aber nicht sichergestellt (Falls kein Sprung zur Case-Marke erfolgt, nach der die Variable definiert wird).
    Deshalb ist es nicht erlaubt...

    Was der gcc-Compiler allerdings anstandslos kompiliert:

    switch(1)
    {
        case 0:
            break;
        case 1:
            int i;
            break;
    }
    

    Hier erfolgt nach der Definition der Variablen i keine Case-Marke mehr und somit kann man sicher sein, dass i erzeugt und initialisiert wurde, wenn man nach der Definition mit i arbeiten wollte. Sauber ist es trotzdem nicht und was der Standard dazu sagt, weiß ich auch nicht.

    PS: Warum man jetzt Variablen innerhalb von geschweiften Klammern nach einer Case-Marke anlegen darf sollte jetzt eigentlich klar sein, aber ich schreibs einfach nochmal deutlich:

    Weil die Variable nur innerhalb dieses Blockes gültig ist und die Definition nicht (innerhalb des Blockes) übersprungen wird... (oder weil Gott es so will, eins von beiden 😉 )



  • Was manchst du für komische Sachen:

    Matrix<double>    *A = NULL; 
    Read_Matrix_File(matrix_file, &A);
    

    A ist doch NULL und ein Zeiger. Also machst du eine Referenz auf einen Zeiger, der NULL ist?



  • DEvent schrieb:

    A ist doch NULL und ein Zeiger. Also machst du eine Referenz auf einen Zeiger, der NULL ist?

    Er bildet die Adresse von einem Zeiger, der NULL ist. Vermutlich damit die Funktion das Ziel des Zeigers manipulieren kann.

    Ob das technisch der beste Weg ist sei mal dahingestellt, aber ansonsten gehört das zu Grundlagen 😉



  • A ist doch NULL und ein Zeiger. Also machst du eine Referenz auf einen Zeiger, der NULL ist?

    so wie lordjaxom es sagt mache ich es auch ....wie sollte es denn "besser" sein?
    eher einen pointer zurückgeben?


Anmelden zum Antworten