У меня есть функция, которую я вызываю, который работает полностью туда, где она должна возвратиться, но не возвращается. Если я ухаживаю за чем-то для отладки в самом конце функции, это отображено, но функция не возвращается.
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;
}
Либо в вашей программе есть какая-то другая строка кода, которая печатает «здесь сделано», либо вы повредили стек и повлияли на адрес возврата. Но я не вижу в стеке буферов, которые можно было бы переполнить.
Вы пробовали использовать отладчик?
Установите точки останова, выполните шаги в отладчике и посмотрите, где фактическое выполнение начинает отличаться от того, что вы думаете должно случиться.
При быстром взгляде на ваш код вы должны получить второе сообщение, но просмотр в отладчике того, что происходит на самом деле, поможет больше, чем любые теоретические размышления о том, что может пойти не так. Также похоже, что у вас будет утечка памяти повсюду, я не вижу никаких delete
для ваших new
s.
Если 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);
}