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 #errorSenf 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 #endifSoll 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