Problem mit CPtrArray



  • Hallo!

    Wenn ich die Daten wieder aus dem CPrtArray abrufen will, kommt es zu einem Ausn ahmefehler.

    cfTest = (CFile*)pDateiliste[i];
    
    // Quellverzeichnis auswählen
    void CVerzeichnis::OpenDir()
    {
    	CString strTemp, strVerzeichnis, strPfad, strDatei;
    	CFile* cfMP3;
    	CFolderDlg dlgVerzeichnis;
    	dlgVerzeichnis.GetFolder(&strTemp, "Bitte wäheln Sie das Quellverzeichnis aus:", NULL, NULL, strTemp);
    
    	strPfad = strTemp;
    	strPfad += "\\*.mp3";
    
    	CFileFind finder;
    	BOOL bWorking = finder.FindFile(strPfad);
    
    	if (bWorking == TRUE)
    	{
    		while (bWorking)
    		{
    			bWorking = finder.FindNextFile();
    			strDatei = finder.GetFilePath();
    			strDatei += finder.GetFileName();
    			cfMP3 = NULL;
    			cfMP3 = new CFile;
    			cfMP3->Open(strDatei, CFile::modeReadWrite | CFile::shareExclusive | CFile::typeBinary);
    			pDateiliste.Add(&cfMP3); // Adresse übergeben &Var
    		}
    
    		CFile* cfTest;
    		for (int i = 0; i <= pDateiliste.GetSize(); i++)
    		{
    			cfTest = (CFile*)pDateiliste[i];
    			strVerzeichnis += cfTest->GetFileName();
    			strVerzeichnis += "\n";
    		}
    
    		MessageBox(NULL, strVerzeichnis, "Verzeichnis", MB_OK);
    	}
    	else
    	{
    		MessageBox(NULL, "Es können keine mp3-Dateien im Verzeichnis gefunden werden.", "Hinweis", MB_OK);
    	}
    }
    


  • Hi,

    also wenn ich die MSDN richtig interpretiere, werden CPtrArrays beginnend mit 0 indiziert. Das bedeutet, dass Du in Deiner for-Schleife um ein Element "zu weit" zählst, dh. dei Schleife müsste so aussehen:

    for (int i = 0; i < pDateiliste.GetSize(); i++)
    

    Gruss

    yeti



  • Hallo!

    Daran liegt es leider nicht ...

    Hiernochmal die deklaration der CPtrArray ...

    CPtrArray pDateiliste;
    

    Gruß cod3r



  • Hi,

    bist Du mal mit dem Debugger durchgegangen? Fliegt er gleich beim ersten Element raus oder hat er wenigstens ein paar "vernünftige" Werte?

    Gruss

    yeti



  • Hallo!

    Das Programm springt schon beim füllen der CPtrArray raus ...
    Muss also irgendwie mit der CFile Variable cfMP3 zuhängen.
    Wenn ich dasnze so löse ...

    // Quellverzeichnis auswählen
    void CVerzeichnis::OpenDir()
    {
    	CString strTemp, strVerzeichnis, strPfad, strDatei;
    	CFolderDlg dlgVerzeichnis;
    	dlgVerzeichnis.GetFolder(&strTemp, "Bitte wäheln Sie das Quellverzeichnis aus:", NULL, NULL, strTemp);
    			CFile cfMP3;
    	strPfad = strTemp;
    	strPfad += "\\*.mp3";
    
    	CFileFind finder;
    	BOOL bWorking = finder.FindFile(strPfad);
    
    	if (bWorking == TRUE)
    	{
    		while (bWorking)
    		{
    			bWorking = finder.FindNextFile();
    			strDatei = finder.GetFilePath();
    			strDatei += finder.GetFileName();
    			//cfMP3 = NULL;
    			//cfMP3 = new CFile;
    
    			cfMP3.Open(strDatei, CFile::modeReadWrite | CFile::shareExclusive | CFile::typeBinary);
    			pDateiliste.Add(&cfMP3); // Adresse übergeben &Var
    		}
    
    		CFile* cfTest;
    		//cfTest = (CFile*)pDateiliste[2];
    		//strVerzeichnis += cfTest->GetFileName();
    
    		for (int i = 0; i < pDateiliste.GetSize(); i++)
    		{
    			cfTest = NULL;
    			cfTest = (CFile*)pDateiliste[i];
    			strVerzeichnis += cfTest->GetFileName();
    			strVerzeichnis += "\n";
    		}
    
    		MessageBox(NULL, strVerzeichnis, "Verzeichnis", MB_OK);
    	}
    	else
    	{
    		MessageBox(NULL, "Es können keine mp3-Dateien im Verzeichnis gefunden werden.", "Hinweis", MB_OK);
    	}
    }
    

    .. kann man zwar alles Problemlos füllen, aber alle Elemente haben die Eigensschaften des letzten eingetragenen Files (wie auch zu erwarten)!!

    Gruß cod3r



  • Hi,

    muss jetzt leider weg, aber einen Tipp habe ich noch: Warum löst Du das Ganze nicht mit einem CStringArray und speicherst dort die Filenamen? Damit sparst Du Dir die ganzen Scherereien mit den Pointern und Du hast Die Filenamen schon im Zugriff und benötigst die GetFileName - Operationen in der Schleife nicht mehr...

    Gruss

    yeti



  • Hallo!

    Ich weiß, aber ich wollt es halt ma auf dem Weg ausprobieren ...
    Naja ... werde morgen mal nen Kollegen fragen.

    Gruß cod3r


Anmelden zum Antworten