Komme nicht weiter -> Access Violation



  • bool c_sprite::extractWorkDir ( char szPath[MAX_PATH] )
    {
    	char *fndest, *extdest;
    	int fn, ext, rest;
    
    	fndest = strrchr( szPath, '\\' );
    	fn = fndest - szPath + 1;
    	extdest = strrchr( szPath, '.' );
    	ext = extdest - szPath + 1;
    
    	rest = strlen(szPath) - fn;
    ->	strncpy( szWorkDir, szPath, fn );
    	_strnset( szWorkDir + fn, '\0', 1 );
    
    	strncpy( szFileName, szPath + fn, ( strlen( szPath ) - fn - ext ) );
    	_strnset( szFileName + rest, '\0', 1 );
    
    	rest = strlen(szPath) - ext;
    	strncpy( szFileExtension, szPath + ext, ( strlen( szPath ) - ext ) );
    	_strnset( szFileExtension + rest, '\0', 1 );
    
    	printf ("Arbeitsverzeichnis:\t%s\nDateiname:\t\t%s\nErweiterung:\t\t%s\n", szWorkDir, szFileName, szFileExtension );
    
    	system ("pause");
    
    	return true;
    }
    

    Die -> Markierte zeile gefällt dem Debugger nicht.
    Und mir inzwischen auch nicht. 😡
    Warum zum Geier bekomm ich da nen Access Violation Error ? ( Naja einer is leicht untertrieben ) 😕
    Achso: Die Variablen, die hier nicht Deklariert wurden, sind global. *indeckunggeh*



  • Allen deratigen

    // 
    /*
     *
     */
    #if 
    // und das dazwischen 
    #endif
    #pragma
    #error
    

    Senf habe ich einfefügt.

    Grüsse

    *this

    Pyro Phoenix schrieb:

    bool c_sprite::extractWorkDir ( char szPath[MAX_PATH] ) // => Ist das vielleicht ein UNICODE String den Du hart gecastet hast ?  
    {
        /*
         *   Gegen Uninitialisirtes prüft sich's später schlecht !
         */
        char *fndest, *extdest; // Beide erstmal = NULL setzen !
        int fn, ext, rest; // dto = 0
    
        fndest = strrchr( szPath, '\\' ); // => Ist das vielleicht NULL weil nichts gefunden wurde? // Kommentar ?
        fn = fndest - szPath + 1; // Kommentar ?
        extdest = strrchr( szPath, '.' ); // Kommentar ?
        ext = extdest - szPath + 1; // Kommentar ?
    
        rest = strlen(szPath) - fn;
    #pragma message("Ich mach das mal in Assembler denn irgendwie erinnert mich Dein Code daran...");
    #pragma message("SCNR ;-)");
    #pragma message("...oder halt in der vorigen Codezeile einen Breakpoint setzen ;-)")
    #if defined(_MSC_VER) 
        __asm {
            int 0x3; // User Breakpoint
        }
    #elif defined(__GNUC__)
        __asm__ ("int $0x3"); // User Breakpoint
    #else
    #error Weder MCVC noch GCC ???
    #endif
        // Hier solls knallen
        strncpy( szWorkDir, szPath, fn ); // => Ist szWorkDir vielleicht NULL
        //
    #pragma message("Zum Rest schweige ich ;-)"); 
        _strnset( szWorkDir + fn, '\0', 1 );
    
    	strncpy( szFileName, szPath + fn, ( strlen( szPath ) - fn - ext ) );
    	_strnset( szFileName + rest, '\0', 1 );
    
    	rest = strlen(szPath) - ext;
    	strncpy( szFileExtension, szPath + ext, ( strlen( szPath ) - ext ) );
    	_strnset( szFileExtension + rest, '\0', 1 );
    
    	printf ("Arbeitsverzeichnis:\t%s\nDateiname:\t\t%s\nErweiterung:\t\t%s\n", szWorkDir, szFileName, szFileExtension );
    
    	system ("pause");
    
    	return true;
    }
    


  • Wieviel Platz ist denn hinter 'szWorkDir' reserviert (bzw. wie ist der überhaupt deklariert?)?

    Ansonsten hätte ich als Alternative noch anzubieten, daß du auf nackte char* verzichtest und std::string verwendest.



  • Sach mal kurz was der Code bewirken soll ... ist jedenfalls sehr schlechter Stil ... Willst du den Pfad, die Extension und den Dateinamen bekommen, oder was?



  • Also ich machs mal kurz und knackig 😃

    Mit der Funktion will ich mir aus dem Absoluten Pfad Das Arbeitsverzeichnis,
    den Dateinamen und die Erweiterung extrahieren.

    Alle Variablen die mit sz... anfangen, haben eine Länge von

    #ifndef MAX_PATH
    #define MAX_PATH 4000
    #endif
    

    Soll heissen, wenn ich grade mal nicht mit MFC arbeite, hat eine sz... Variable
    eine länge von 4000 char.

    Zu meinem Stil:
    Ich hab C++ nicht in der Schule oder sonstwo gelernt, sonder hier ganz allein
    vor meinem PC. Da kanns schonmal passieren, das der eine oder andere Code
    stilistisch nicht ganz dem Standard entspricht. 😉

    Edit:

    Ich hatte den Pfad manuell eingegeben ... ich glaub, das war ein Fehler 🙄

    Vorher:

    c_sprite sprite ( "K:\Eigene Dateien\Eigene C++ Projekte\sprinfo\Debug\bm1.spr" );
    

    Nachher:

    c_sprite sprite ( "K:\\Eigene Dateien\\Eigene C++ Projekte\\sprinfo\\Debug\\bm1.spr" );
    

    Jetzt hängt er nichtmehr beim ersten strncpy sondern beim nächsten. 😞



  • Pyro Phoenix schrieb:

    ...
    Mit der Funktion will ich mir aus dem Absoluten Pfad Das Arbeitsverzeichnis,
    den Dateinamen und die Erweiterung extrahieren....

    Also für sowas gibt's prima C++-Dinge: string, find(), find_first(), find_last_not_of(), ....

    Und alle ohne (zu setzenden oder fehlenden) Nullterminierer, Speicherüberschreitungen, ...

    Was mir noch auffällt: Du hast überhaupt keine Fehlerprüfung ! Wenn Dir also jemanden ein String gibt, bei dem z.B. gar kein '\' drin ist, hast Du schon eine access violation....

    Gruß,

    Simon2.



  • Ja 😋
    War wohl n bisschen spät gestern, das mit der Fehlerprüfung ist mir auch grade
    eben erst eingefallen.

    So Danke Jungs 😃

    Jetzt funktionierts :p

    bool c_sprite::extractWorkDir ( char szPath[MAX_PATH] )
    {
    	char *fndest, *extdest;
    	int fn, ext, rest;
    
    	if ( (fndest = strrchr( szPath, '\\' ) ) == NULL )
    		return false;
    	fn = fndest - szPath + 1;
    	if ( (extdest = strrchr( szPath, '.' ) ) == NULL )
    		return false;
    	ext = extdest - szPath;
    
    	rest = strlen(szPath) - fn;
    	strncpy( szWorkDir, szPath, fn );
    	_strnset( szWorkDir + fn, '\0', 1 );
    
    	rest = strlen(szPath) - ext -1;
    	strncpy( szFileName, szPath + fn, ( strlen( szPath ) - ext ) );
    	_strnset( szFileName + rest, '\0', 1 );
    
    	rest = strlen(szPath) - ext;
    	strncpy( szFileExtension, szPath + ext, ( strlen( szPath ) - ext ) );
    	_strnset( szFileExtension + rest, '\0', 1 );
    
    #ifdef _DEBUG
    	printf ("Arbeitsverzeichnis:\t%s\nDateiname:\t\t%s\nErweiterung:\t\t%s\n", szWorkDir, szFileName, szFileExtension );
    	system ("pause");
    #endif
    
    	return true;
    }
    


  • hmm und jetzt mal Ordentlich 😉

    void split_path(const std::string& fullpath, std::string& file, std::string& ext, std::string& path)
    {
    	std::size_t pos = fullpath.find_last_of('\\');
    	if (pos != std::string::npos)
    	{
    		path = fullpath.substr(0, pos);
    		std::size_t pos_ext = fullpath.find_last_of('.');
    		if (pos_ext != std::string::npos)
    		{
    			ext = fullpath.substr(pos_ext + 1);
    			file = fullpath.substr(pos + 1, fullpath.length() - pos_ext);
    		}
    		else
    		{
    			file = fullpath.substr(pos + 1);
    		}
    	}
    }
    

    ... ist ja selbst erklären ... und sauber 😉
    Edit
    Fehlerteufel war drin 😉


Anmelden zum Antworten