PDA

Visualizza la versione completa : [C++] Crash in un funzione utilizza tipi string


kirakira93
30-03-2010, 13:52
Ciao ragazzi, scusate per il titolo un po' generico ma è il più appropiato che mi veniva in mente.
Il problema è questo:
In un file ci sono queste 5 righe:


C:\windows\notepad.exe::134
C:\windows\include.exe::178
C:\fileaaaaa.exe::178
C:\::8
C:\windows\notepad.exe::66


Con questa funzione separo la path dal resto (::blablabla)e la assegno ad un tipo string.

Funzione:


string PrendiPath(char RigaDaAnalizzare[1000])
{
string str_Path;
for(int FOR1 = 0, FINEFOR1 = 0; FOR1 < strlen(RigaDaAnalizzare) && FINEFOR1 < 1; FOR1++)
{
if(RigaDaAnalizzare[FOR1] == ':' && RigaDaAnalizzare[FOR1 + 1] == ':')
{str_Path.assign(RigaDaAnalizzare,0 ,FOR1); FINEFOR1 = 1; }
//quando trova "::" copia in str_Path il codice che precede"::"
}
return str_Path;
}


La funzione lavora perfettamente per le prime quattro righe di file passategli, ma quando arriva all'ultima: C:\windows\notepad.exe::66 va in crash.

Usando il debug sono arrivato a concludere che il crash è nel return della funzione e penso che sia dovuto al fatto che la stringa precedente era

C:\::8
e quindi la memorua riservata per il return della funzione si è "accorciata" e poi quando la funzione ha ritornato (che è una stringa con più caratteri della precedente)

C:\windows\notepad.exe::66
la memoria non bastava ed ecco il CRASH!!!

Come posso fare? Help :(

linoma
30-03-2010, 13:55
Secondo me cn un break dovresti risolvere la maggior parte dei problemi, very very nice quel parametro in ingresso :messner:

kirakira93
30-03-2010, 14:00
Grazie, ma un break cosa significa???

linoma
30-03-2010, 16:18
Bhe prima il codice postato aveva la riga nell'if commentata e quindi il FOR1 + 1 ti avrebbe potuto creare dei problemi. Cn la tua riga il break diventa + elegante ma nn necessario.
Mi pare che tu stia usando .NET ecco io userei i metodi dello oggetto string tipo indexOf() etc etc anche molto + veloci del codice unsafe.
Altrimenti nn vedo nulla di anormale, quindi aspetto anch'io una risposta visto che sn incuriosito.

MItaly
30-03-2010, 16:34
Ma usare una normale sscanf o uno string stream invece di fare tutto quel casino pare così brutto? :stordita:
Per inciso, normalmente i nomi tutti maiuscoli si riservano solo per le macro del preprocessore.

kirakira93
30-03-2010, 16:49
Ok, ma comunque in un altro sorgente devo fare la stessa operazione senza prendere dati da un file: data una path ritornata dalla funzione apri( quella dei programmi FILE > APRI, adeeso non mi ricordo di preciso come si chiama) la funzione dovrebbe considerare i valori dopo l'ultimoi backslash.
Stessa storia di crash.... :cry:

MItaly
30-03-2010, 17:19
Per quel mestiere c'è la PathFindFileName (http://msdn.microsoft.com/en-us/library/bb773589%28VS.85%29.aspx).
In ogni caso la tua funzione deve cercare fino a strlen(eccetera)-1, visto che nel ciclo poi guarda anche il carattere successivo a FOR1. Però fai sparire quel FINEFOR1 usando un break, e dichiara FOR1 con un nome sensato e con scope limitato al for.

kirakira93
31-03-2010, 21:33
Eccomi di nuovo qui, scusate se non ho risposto subito ma ho dei problemi con il boot loader di win 7 e mi sa che mi tocca reinstallare il sistema operativo ... :( pertanto non penso di riuscire a rispondere subito ai messaggi, infatti sono con una versione live di linux.
Ritornando al problema, c'erano due errori, che però non ero riscito a definire con il debug.
Uno era un problema alquanto sottile trala conversione tra string, cher [] , char * e String (infatti sto sviluppando un'applicazione con rad-c++), superata.
L'altro problema è che senza accorgemene avevo definito i membri di un array a struttura con un cosnt int, e poi veniva ridefinito.... caos, ma sono riuscito, grazie di tutto, specialmente per questo:


PathFindFileName Function


:D

MItaly
01-04-2010, 14:35
:D
In effetti le shell lightweight functions sono davvero comode... non che siano nulla di trascendentale, PathFindFileName si potrebbe implementare tre righe:


LPTSTR PathFindFileName(LPCTSTR pPath)
{
TCHAR * readPtr;
for(readPtr=pPath+tcslen(pPath)-1; readPtr>pPath && *readPtr!='\\' && *readPtr!='/';readPtr--);
return readPtr;
}

ma spesso non si ha voglia di scrivere le tre righe in questione. :)

Loading