2010-05-01 18 views
5

वापस नहीं आएगा मेरे पास एक ऐसा फ़ंक्शन है जिसे मैं कॉल कर रहा हूं जो इसे वापस लौटाए जाने के लिए सभी तरह से चलता है लेकिन वापस नहीं आता है। अगर मैं फ़ंक्शन के बहुत अंत में डिबगिंग के लिए कुछ कहता हूं, तो यह प्रदर्शित हो जाता है लेकिन फ़ंक्शन वापस नहीं आता है।सी ++ फ़ंक्शन

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; 
    } 
+0

आप जो कुछ कर रहे हैं वह "' printf' डीबगिंग "कहलाता है, और इसकी आमतौर पर अनुशंसा नहीं की जाती है। आपको एक वास्तविक डीबगर का उपयोग करने की आवश्यकता होगी। इसके अलावा, प्रति टैब स्तर पर एक से अधिक स्थान इंडेंट करें। यह पढ़ना असंभव है ... – rlbond

+9

@rlbond मैं लगभग सभी डिबगिंग करता हूं "प्रिंटफ डीबगिंग" - अभ्यास के साथ बिल्कुल कुछ भी गलत नहीं है। –

+0

प्रिंटफ डिबगिंग असफलता के सामान्य क्षेत्रों को समझने के लिए बहुत अच्छा काम करता है, लेकिन विवरण के लिए, डिबगर्स अधिक मदद करते हैं। – ssube

उत्तर

4

या तो वहाँ अपने कार्यक्रम में किसी अन्य कोड लाइन है कि प्रिंट "यहाँ किया" है, या आप ढेर भ्रष्ट कर रहे हैं और वापसी पता प्रभावित किया। लेकिन मुझे उस स्टैक पर कोई भी बफर नहीं दिख रहा है जिसे आप ओवरराउन कर सकते हैं।

क्या आपने डीबगर का उपयोग करने का प्रयास किया है?

+0

ठीक है, मैं विजुअल सी ++ 2008 एक्सप्रेस का उपयोग कर रहा हूं और वास्तव में पहले डीबगर का उपयोग नहीं किया है। मैंने cout << "यहाँ किया" पर एक ब्रेकपॉइंट सेट किया और देखा कि वर्तमान डेटापोजिशन के लिए दिखाया गया मान लाल रंग में है। मुझे कल्पना है कि इसका मतलब है कि कुछ गलत है? – Mike

+1

जब आप डीबगर चलाते हैं और ब्रेकपॉइंट तक पहुंचते हैं, तो क्या आपको कोई त्रुटि दिखाई देती है? यदि आप वापसी करते हैं और वापसी पर हिट करते हैं, तो निष्पादन कहां जाता है? – ssube

+0

ठीक बयान के ब्रेकपॉइंट पर मुझे यह त्रुटि मिली: ext2Interface.exe में 0x77004230 पर फर्स्ट-मौका अपवाद: 0xC0000005: उल्लंघन उल्लंघन स्थान 0x00000004 एक्सेस करें। – Mike

2

ब्रेकपॉइंट्स सेट करें, डीबगर में चरणबद्ध करें, और देखें कि वास्तविक निष्पादन आपके विचार से अलग होना शुरू करता है।

अपने कोड पर एक त्वरित नज़र से, आपको दूसरा संदेश मिलना चाहिए, लेकिन एक डीबगर में जाकर देखना कि वास्तव में क्या होता है, यह गलत हो सकता है कि किसी भी सैद्धांतिक संगीत से अधिक मदद करेगा। ऐसा लगता है कि आप हर जगह स्मृति लीक करेंगे, मुझे आपके new एस के साथ जाने के लिए delete एस नहीं दिखाई देता है।

1

यदि 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); 
    } 
+0

लेकिन ओपी का कहना है कि "यहां किया गया" प्रदर्शित होता है, जिसका अर्थ है कि भाग खत्म होता है। – IVlad

+0

माइक के अलावा, "यहां किया गया" लाइन प्रदर्शित होती है, और वह printf कॉल करने के बाद कॉल() और वापस लौटने से पहले आता है। – ssube

+0

वह हिस्सा खत्म होता है जैसा कि अन्य ने कहा है। appendData सरणी पर अधिक मूल्य जोड़ नहीं रहा है। यह उन मानों को सेट कर रहा है जो पहले से मौजूद हैं। – Mike

संबंधित मुद्दे