[AdressÜbergabe] Was ist daran falsch?



  • lol...
    das wird immer verrückter:

    // Wenn die Funktin so ist:
    meResult LoadDMusicMusic(const char* filename, meMusic music)
    {
            IDirectMusicSegment8* seg;
    
    	if(FAILED(g_MusicLoader->LoadObjectFromFile(
    				CLSID_DirectMusicSegment,
    				IID_IDirectMusicSegment8,
    				wf,
    				(void**)&music->DMus_data)))
    		return ME_ERROR;
    
    	//music->DMus_data = seg;
    	return ME_OK;
    }
    // Dann funkitoniert sie einwandfrei
    
    // Aber wenn sie so ist:
    meResult LoadDMusicMusic(const char* filename, meMusic music)
    {
    	//IDirectMusicSegment8* seg;
    	WCHAR wf[MAX_PATH];
    	MultiByteToWideChar( CP_ACP, 0, filename, -1, 
    		wf, MAX_PATH );
    	wf[MAX_PATH] = 0;
    	if(FAILED(g_MusicLoader->LoadObjectFromFile(
    				CLSID_DirectMusicSegment,
    				IID_IDirectMusicSegment8,
    				wf,
    				(void**)&music->DMus_data)))
    		return ME_ERROR;
    
    	//music->DMus_data = seg;
    	return ME_OK;
    }
    // dann kommt wieder das mit "Der Ausdruck kann nicht ausgewertet werden"
    

    Ich versteh das jetzt wirklich überhaupt nicht mher... Ist ja nur eine Variablendeklaration auskommentiert, die ich soweiso nicht brauche...



  • Das könnte auch an nem Fehler in deiner IDE oder deinem Compiler sein, lösch mal alle Dateien die deine IDE/Compiler so anlegen und kompiliere das Projekt nochmal neu, vllt. geht es dann ja.

    Wenn nicht, dann schau mal ob weiter oben in der Datei nicht irgendwo ein Syntaxfehler ist, welcher sich erst weiter unten durch nen Fehler bemerkbar macht.



  • also, neu erstellen bzw. bereinigen hat nichts gebracht, ist noch genau so. Syntaxfehler können eigentlich gar nicht sein, ist ja ne abgeschlossene Funktion, davor ist nur MultiByteToWideChar(), ansonsten nichts anders.



  • ersuche doch einmal:

    meResult LoadDMusicMusic(const char* filename, meMusic music)
    {
        IDirectMusicSegment8* seg = music->DMus_data;
        WCHAR wf[MAX_PATH];
        MultiByteToWideChar( CP_ACP, 0, filename, -1, wf, MAX_PATH );
        //wf[MAX_PATH] = 0; // das macht keinen Sinn filename ist hoffentlich schon 0-terminiert
    
        if(FAILED(g_MusicLoader->LoadObjectFromFile(
                    CLSID_DirectMusicSegment,
                    IID_IDirectMusicSegment8,
                    wf,
                    (void**)&seg)))
            return ME_ERROR;
        return ME_OK;
    }
    

    Das sollte zwar keinen Unterschied machen.
    Wenns trotzdem geht hat wahrscheinlich dein Compiler einen Patschen.

    Maxi schrieb:

    Syntaxfehler können eigentlich gar nicht sein, ist ja ne abgeschlossene Funktion, davor ist nur MultiByteToWideChar(), ansonsten nichts anders.

    Der Fehler muss nich umbedingt in der funktion sein wo er auftritt. Du könntest z.b. in einer vorhergehenden Funktion
    ein } vergessen haben.

    Kurt.



  • so geht es nicht:

    Wenn ich das so mache, dann zeigt seg nach dem Aufruf an die bestimmte Adresse, aber music->DMusic_Data zeigt immernoch auf NULL. Da muss irgendwo nen Fehler mit den Zeigern sein, denk ich, aber ich weiß nicht, welcher...



  • sorry hatte nicht realisiert dass das ein rückgabe-parameter ist ( hätte es bemerken sollen wegen void** ).
    mal sehen was bei folgendem versuch passiert.

    meResult LoadDMusicMusic(const char* filename, meMusic music)
    {
        IDirectMusicSegment8* seg = 0; 
        WCHAR wf[MAX_PATH];
        MultiByteToWideChar( CP_ACP, 0, filename, -1, wf, MAX_PATH );
        //wf[MAX_PATH] = 0; // das macht keinen Sinn filename ist hoffentlich schon 0-terminiert
    
        if(FAILED(g_MusicLoader->LoadObjectFromFile(
                    CLSID_DirectMusicSegment,
                    IID_IDirectMusicSegment8,
                    wf,
                    (void**)&seg)))
            return ME_ERROR;
            {   
                // zuweisung an temporäre struct in eigenem scope
                // sollte den fehler von eventuellem vorhergehenden fehlern entkoppeln.
                meMusic tmp = new meMusicStruct;
                tmp->DMus_data = seg;               // zuweisung muss funktionieren
                music->DMus_data = tmp->DMus_data;  // könnte fehlschlagen
                delete tmp;
            } 
        return ME_OK;
    }
    

    Poste was passiert. und wo genau der fehler auftritt.
    K



  • wenn ichs so mache, dann gehts gut.
    kein Fehler. Aber dieser Test bringt irgendwie auch ncith so viel, weils ja anscheinend nur von einer Zeile abhängt, auch wenn die darin deklarierte VAriable gar nicht verwendet wird.



  • also wenn das wirklich funktioniert dann hat dein compiler einen bug. 😮
    K.



  • ist ja auch schohn relativ alt das teil, VC6 ohne servicepacks und so, die laufen nicht, weil ich win98 hab 😞
    Ich glaub das lohnt auch nicht mehr, das MS zu zeigen, das schauen die sich sowieso nicht mehr an. Ich hab mir schon immer gedacht, da ist doch irgendwo nen Fehler , im Compiler, weil manchmal vc echt ziemlich spinnt.



  • ZuK schrieb:

    //wf[MAX_PATH] = 0; // das macht keinen Sinn filename ist hoffentlich schon 0-terminiert
    

    Nicht nur, dass es keinen Sinn macht, es ist schlichtweg falsch. Der Zugriff auf den Speicher wf[MAX_PATH] gibt UB, da wf maximal bis MAX_PATH - 1 indexiert werden darf.


Anmelden zum Antworten