2010-05-01 17 views
5

Ho una funzione che sto chiamando che arriva fino a dove dovrebbe tornare ma non ritorna. Se coutro qualcosa per il debug alla fine della funzione, viene visualizzato ma la funzione non ritorna.La funzione C++ non verrà restituita

fetchData è la funzione a cui mi riferisco. Viene chiamato da outputFile. cout mostra "done here" ma non "data picking"

So che questo codice è disordinato ma qualcuno può aiutarmi a capirlo?

Grazie

//Given an inode return all data of i_block data 
    char* fetchData(iNode tempInode){ 
    char* data; 
    data = new char[tempInode.i_size]; 
    this->currentInodeSize = tempInode.i_size; 

    //Loop through blocks to retrieve data 
    vector<unsigned int> i_blocks; 
    i_blocks.reserve(tempInode.i_blocks); 

    this->currentDataPosition = 0; 
    cout << "currentDataPosition set to 0" << std::endl; 
    cout << "i_blocks:" << tempInode.i_blocks << std::endl; 
    int i = 0; 
    for(i = 0; i < 12; i++){ 
    if(tempInode.i_block[i] == 0) 
    break; 
    i_blocks.push_back(tempInode.i_block[i]); 
    } 

    appendIndirectData(tempInode.i_block[12], &i_blocks); 
    appendDoubleIndirectData(tempInode.i_block[13], &i_blocks); 
    appendTripleIndirectData(tempInode.i_block[14], &i_blocks); 

    //Loop through all the block addresses to get the actual data 
    for(i=0; i < i_blocks.size(); i++){ 
    appendData(i_blocks[i], data); 
    } 
    cout << "done here" << std::endl; 

    return data; 
    } 




    void appendData(int block, char* data){ 
    char* tempBuffer; 
    tempBuffer = new char[this->blockSize]; 

    ifstream file (this->filename, std::ios::binary); 
    int entryLocation = block*this->blockSize; 
    file.seekg (entryLocation, ios::beg); 
    file.read(tempBuffer, this->blockSize); 

    //Append this block to data 
    for(int i=0; i < this->blockSize; i++){ 
    data[this->currentDataPosition] = tempBuffer[i]; 
    this->currentDataPosition++; 
    } 
    data[this->currentDataPosition] = '\0'; 
    } 

    void outputFile(iNode file, string filename){ 
    char* data; 
    cout << "File Transfer Started" << std::endl; 
    data = this->fetchData(file); 
    cout << "data fetched" << std::endl; 

    char *outputFile = (char*)filename.c_str(); 
    ofstream myfile; 
    myfile.open (outputFile,ios::out|ios::binary); 
    int i = 0; 
    for(i=0; i < file.i_size; i++){ 
    myfile << data[i]; 
    } 
    myfile.close(); 
    cout << "File Transfer Completed" << std::endl; 
    return; 
    } 
+0

Quello che stai facendo è qualcosa chiamato "debug" printf' ", ed in genere non è raccomandato. Avrai bisogno di usare un vero debugger. Inoltre, per favore indentare più di uno spazio per livello di tabulazione. È semplicemente impossibile leggere ... – rlbond

+9

@rlbond quasi tutto il debug che faccio è "debugging di printf" - non c'è assolutamente nulla di sbagliato nella pratica. –

+0

Il debugging di Printf è ottimo per capire le aree generali di errore, ma per i dettagli i debugger aiutano di più. – ssube

risposta

4

O c'è qualche altra riga di codice nel vostro programma che stampa "fatto qui", o che cerchiate corrompere lo stack e colpito l'indirizzo di ritorno. Ma non vedo alcun buffer nello stack che potresti sovrascrivere.

Hai provato a utilizzare un debugger?

+0

Ok, sto usando Visual C++ 2008 Express e non ho ancora utilizzato il debugger prima d'ora. Ho impostato un breakpoint in cout << "done here" e ho notato che il valore mostrato per currentDataPosition è in rosso. Immagino che questo significhi che qualcosa non va lì? – Mike

+1

Quando si esegue il debugger e si raggiunge il punto di interruzione, vengono visualizzati errori? Se passi e colpisci il ritorno, dove finisce l'esecuzione? – ssube

+0

Ok al punto di interruzione dell'istruzione return ho ricevuto questo errore: Eccezione di prima volta a 0x77004230 in ext2Interface.exe: 0xC0000005: posizione di lettura violazione di accesso 0x00000004. – Mike

2

Impostare punti di interruzione, passaggio in un debugger e vedere dove l'esecuzione effettiva inizia a differire da ciò che si pensa dovrebbe accadere.

Da una rapida occhiata al tuo codice, dovresti ottenere il secondo messaggio, ma passare attraverso un debugger e vedere cosa succede realmente aiuterà più di ogni riflessione teorica su cosa potrebbe andare storto. Sembra anche che tu stia perdendo memoria ovunque, non vedo alcun delete s per andare con il tuo new s.

1

Se appendData() continua ad aggiungersi a i_blocks, la struttura dei dati continua a crescere e così fa i_blocks.size(). Questo non uscirà mai !!!

//Loop through all the block addresses to get the actual data 
    for(i=0; i < i_blocks.size(); i++){ 
    appendData(i_blocks[i], data); 
    } 
+0

Ma l'OP dice che "done here" viene visualizzato, il che significa che la parte finisce. – IVlad

+0

Tranne che Mike ha detto che viene visualizzata la riga "done here" e che printf viene dopo la chiamata ad appendData() e immediatamente prima del ritorno. – ssube

+0

Quella parte finisce come gli altri hanno detto. appendData non aggiunge più valori all'array. Sta impostando i valori che sono già lì. – Mike

Problemi correlati