2016-11-19 294 views
-1

我做了一個節目,當我調試崩潰,並顯示我的錯誤:C++異常拋出

異常在PROJECT1.EXE在0x0FC93AA8(vcruntime140d.dll)拋出:0000005:訪問衝突讀取位置0x8BADB618。

如果有這種異常的處理程序,程序可能會安全地繼續。

任何想法可能是什麼?

#include <iostream> 
#include <string> 
#include <fstream> 
#include <iostream> 
using namespace std; 


class bendraAbonentoInformacija 
{ 
public: 
string vardasPavarde; 
string asmensKodas; 
string adresas; 
double suma; 
string tiekejas; 

}; 
class elektra : public bendraAbonentoInformacija 
{ 
public: 
    double tarifas; 
    int skaitiklisNuo; 
} rect; 
class siuksles : public bendraAbonentoInformacija 
{ 
public: 
int kvadratura; 
}; 
class vanduo : public bendraAbonentoInformacija 
{ 
public: 
int saltasVanduo; 
int sildymas; 
}; 

void nuskaitymas(int& i, bendraAbonentoInformacija masyvas[], elektra elektrosMasyvas[], siuksles siuksliuMasyvas[], vanduo vandensMasyvas[]) 
{ 
ifstream duomenuNuskaitymas; 
duomenuNuskaitymas.open ("duomenys.txt"); 
string vardasPavarde; 
string asmensKodas; 
string adresas; 
double suma; 
string tiekejas; 
int tarifas; 
double skaitliukas; 
int kvadratura; 
int saltasVanduo; 
int sildymas; 

i = 0; 

if (duomenuNuskaitymas.is_open()) 
{ 
    while (!duomenuNuskaitymas.eof()) 
    { 

     duomenuNuskaitymas >> masyvas[i].vardasPavarde >> masyvas[i].asmensKodas >> masyvas[i].adresas >> masyvas[i].suma >> masyvas[i].tiekejas; 

     if (masyvas[i].tiekejas == "Vilniaus energija") 
     { 
      duomenuNuskaitymas >> elektrosMasyvas[i].tarifas >> elektrosMasyvas[i].skaitiklisNuo; 

     } 
     else if (masyvas[i].tiekejas == "Kauno svara") 
     { 
      duomenuNuskaitymas >> siuksliuMasyvas[i].kvadratura; 
     } 
     else if (masyvas[i].tiekejas == "Rokiskio vandenys") 
     { 
      duomenuNuskaitymas >> vandensMasyvas[i].saltasVanduo >> vandensMasyvas[i].sildymas; 
     } 

     i++; 

    } 

    duomenuNuskaitymas.close(); 
} 

else cout << "Unable to open file"; 

} 

void PaieskaPagalAsmensKodaIrRikiavimas(int i, bendraAbonentoInformacija masyvas[]) 
{ 
string AsmensKodas; 
bendraAbonentoInformacija abonentas[1000]; 
bendraAbonentoInformacija Kintamasis; 
int k = 0; 

cout << "Iveskite asmens, kurio saskaitos ieskote, asmens koda: "; 
cin >> AsmensKodas; 

cout << "Rasta informacija:" << endl; 

for (int j = 0; j < i; j++) 
{ 
    if (AsmensKodas == masyvas[j].asmensKodas) 
    { 
     cout << masyvas[j].vardasPavarde << masyvas[j].adresas << masyvas[j].asmensKodas << masyvas[j].suma; 
     abonentas[k] = masyvas[j]; 
     k++; 
    } 
} 

for (int i = 0; i < k; i++) 
{ 
    if (abonentas[i].suma < abonentas[i + 1].suma) 
    { 
     Kintamasis = abonentas[i]; 
     abonentas[i] = abonentas[i + 1]; 
     abonentas[i + 1] = Kintamasis; 
    } 
} 

for (int i = 0; i < k; i++) 
{ 
    cout << abonentas[i].vardasPavarde << abonentas[i].suma; 
} 

} 


int main() 
{ 

int i; 
bendraAbonentoInformacija masyvas[1000]; 
elektra elektrosMasyvas[1000]; 
siuksles siuksliuMasyvas[1000]; 
vanduo vandensMasyvas[1000]; 

nuskaitymas(i, masyvas, elektrosMasyvas, siuksliuMasyvas, vandensMasyvas); 
//PaieskaPagalAsmensKodaIrRikiavimas(i,masyvas); 

return 0; 
} 
+0

我可能會在這裏超過語言障礙,但沒有輸入文件很難重現。 –

+0

您可能會嘗試將有問題的代碼放入try {...} catch(...){}塊中,但我認爲您應該找出訪問衝突的原因。由於您已經調試過程序,您是否可以在程序中標記導致訪問衝突的行? – chtz

回答

0

如果執行足夠多的while循環迭代,nuskaitymas中的數組訪問可能會超出邊界。考慮使用動態大小的數據類型,如std::vector。使用std::ifstream也可以改善。而不是!duomenuNuskaitymas.eof(),請使用!duomenuNuskaitymas。此外,明確結束std::ifstream是不必要的。當對象超出範圍並調用析構函數時,將執行此操作。最後,我會檢查從std::ifstream讀入是否成功。如果不是,那麼你將無法讀入新的值,同時增加索引並且永遠不會到達文件的結尾。