2010-05-01 20 views
5

Tengo una función a la que llamo que corre hasta donde debe regresar, pero no regresa. Si configuro algo para la depuración al final de la función, se muestra pero la función no regresa.La función de C++ no devolverá

fetchData es la función a la que me refiero. Se llama por outputFile. cout muestra "hecho aquí" pero no "datos obtenidos"

Sé que este código es complicado pero ¿alguien me puede ayudar a resolverlo?

Gracias

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

Lo que está haciendo es algo llamado "depuración' printf', y generalmente no se recomienda. Necesitarás usar un depurador real. Además, sangra más de un espacio por nivel de pestaña. Esto es simplemente imposible de leer ... – rlbond

+9

@rlbond casi toda la depuración que hago es "depuración de printf" - no hay absolutamente nada de malo en la práctica. –

+0

La depuración de Printf funciona muy bien para descubrir las áreas generales de falla, pero para los detalles, los depuradores ayudan más. – ssube

Respuesta

4

O hay alguna otra línea de código en su programa que imprime "hecho aquí", o le esté corrompiendo la pila y afectado a la dirección de retorno. Pero no veo ningún búfer en la pila que puedas sobrepasar.

¿Ha intentado utilizar un depurador?

+0

Ok, estoy usando Visual C++ 2008 Express y no he usado el depurador antes de ahora. Establecí un punto de interrupción en cout << "hecho aquí" y noté que el valor mostrado para currentDataPosition está en rojo. Me imagino que esto significa que algo está mal allí? – Mike

+1

Cuando ejecuta el depurador y alcanza el punto de interrupción, ¿ve algún error? Si das un paso y presionas el retorno, ¿hacia dónde va la ejecución? – ssube

+0

Ok en el punto crítico de la declaración de devolución Obtuve este error: Excepción de primera oportunidad en 0x77004230 en ext2Interface.exe: 0xC0000005: Acceso a la ubicación de lectura de la infracción 0x00000004. – Mike

2

Establezca puntos de interrupción, acceda a un depurador y vea dónde la ejecución real comienza a diferir de lo que cree que debería suceder.

Al echarle un vistazo rápido a su código, debería recibir el segundo mensaje, pero pasar por un depurador y ver lo que realmente sucede ayudará más que cualquier reflexión teórica sobre lo que podría estar yendo mal. También parece que vas a tener pérdidas de memoria en todas partes, no veo ningún delete s para ir con tu new s.

1

Si appendData() se sigue añadiendo a i_blocks, la estructura de datos sigue creciendo y también lo hace i_blocks.size(). ¡Esto nunca saldrá!

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

Pero el OP dice que se muestra "hecho aquí", lo que significa que la pieza termina. – IVlad

+0

Excepto Mike dijo que se muestra la línea "hecho aquí", y que printf viene después de la llamada a appendData() e inmediatamente antes de regresar. – ssube

+0

Esa parte termina como lo han dicho los demás. appendData no agrega más valores en la matriz. Está configurando los valores que ya están allí. – Mike

Cuestiones relacionadas