C ++ функция не вернет - PullRequest
6 голосов
/ 01 мая 2010

У меня есть функция, которую я вызываю, которая работает до того места, где она должна вернуться, но не возвращается. Если я отыщу что-то для отладки в самом конце функции, оно отобразится, но функция не вернется.

fetchData - это функция, о которой я говорю. Он вызывается outputFile. cout отображает «сделано здесь», но не «данные извлечены»

Я знаю, что этот код грязный, но может кто-нибудь помочь мне разобраться?

Спасибо

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

Ответы [ 3 ]

4 голосов
/ 01 мая 2010

Либо в вашей программе есть какая-то другая строка кода, которая печатает «сделано здесь», или вы повредили стек и повлияли на адрес возврата. Но я не вижу в стеке буферов, которые вы могли бы переполнить.

Вы пробовали использовать отладчик?

2 голосов
/ 01 мая 2010

Установите точки останова, войдите в отладчик и посмотрите, где фактическое выполнение начинает отличаться от того, что, по вашему мнению, должно произойти.

После быстрого просмотра вашего кода вы должны получить второе сообщение, но прохождение в отладчике и просмотр того, что действительно происходит, поможет больше, чем любые теоретические размышления о том, что может пойти не так. Выглядит так, как будто вы будете пропускать память повсюду, я не вижу никаких delete с ваших new с.

1 голос
/ 01 мая 2010

Если appendData () продолжает добавляться к i_blocks, то структура данных продолжает расти, как и i_blocks.size (). Это никогда не выйдет !!!

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