Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [C++] Crash in un funzione utilizza tipi string

    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:
    codice:
    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:
    Codice PHP:
    string PrendiPath(char RigaDaAnalizzare[1000])
    {
    string str_Path;
    for(
    int FOR1 0FINEFOR1 0FOR1 strlen(RigaDaAnalizzare) && FINEFOR1 1FOR1++)
        {
    if(
    RigaDaAnalizzare[FOR1] == ':' && RigaDaAnalizzare[FOR1 1] == ':'
    {
    str_Path.assign(RigaDaAnalizzare,,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
    codice:
    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)
    codice:
    C:\windows\notepad.exe::66
    la memoria non bastava ed ecco il CRASH!!!

    Come posso fare? Help

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Secondo me cn un break dovresti risolvere la maggior parte dei problemi, very very nice quel parametro in ingresso
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Un break

    Grazie, ma un break cosa significa???

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    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.
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Ma usare una normale sscanf o uno string stream invece di fare tutto quel casino pare così brutto?
    Per inciso, normalmente i nomi tutti maiuscoli si riservano solo per le macro del preprocessore.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    ok

    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....

  7. #7
    Per quel mestiere c'è la PathFindFileName.
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    trovato!

    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

  9. #9

    In effetti le shell lightweight functions sono davvero comode... non che siano nulla di trascendentale, PathFindFileName si potrebbe implementare tre righe:
    codice:
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.