2016-11-19 8 views
-1

habe ich ein Programm, und wenn ich es debuggen stürzt und zeigt mir den Fehler:C++ Exception werfen

Ausnahme bei 0x0FC93AA8 geworfen (vcruntime140d.dll) in Projekt1.exe: 0xC0000005: Zugriffsverletzung Leseort 0x8BADB618.

Wenn für diese Ausnahme ein Handler vorhanden ist, kann das Programm sicher fortgesetzt werden.

Irgendwelche Ideen, was könnte es sein?

#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

Ich könnte hier vielleicht die Sprachbarriere überwinden, aber ohne die Eingabedatei ist es schwer zu reproduzieren. –

+0

Sie können versuchen, den fehlerhaften Code in einen 'try {...} catch (...) {}' Block zu setzen, aber ich denke, dass Sie eher den Grund für die Zugriffsverletzung finden sollten. Da Sie Ihr Programm bereits debuggt haben, könnten Sie die Zeile in Ihrem Programm markieren, die die Zugriffsverletzung verursacht? – chtz

Antwort

0

Der Feldzugriff in nuskaitymas kann außerhalb der Grenzen gehen, wenn ausreichend viele Iterationen der while-Schleife ausgeführt werden. Erwägen Sie die Verwendung eines dynamisch skalierten Datentyps wie std::vector.

Die Verwendung von std::ifstream kann ebenfalls verbessert werden. Verwenden Sie anstelle von !duomenuNuskaitymas.eof()!duomenuNuskaitymas. Außerdem ist das explizite Schließen von std::ifstream nicht erforderlich. Dies wird ausgeführt, wenn das Objekt den Gültigkeitsbereich verlässt und der Destruktor aufgerufen wird. Schließlich würde ich überprüfen, ob das Einlesen von std::ifstream erfolgreich ist. Wenn dies nicht der Fall ist, würden Sie beide neue Werte nicht einlesen und gleichzeitig den Index erhöhen und niemals das Ende der Datei erreichen.

Verwandte Themen