2016-11-19 1 views
-1

J'ai fait un programme et quand je debug, il se bloque et me montre l'erreur:C++ Exception jet

Exception lancée à 0x0FC93AA8 (vcruntime140d.dll) dans Project1.exe: 0xC0000005: Accès emplacement de lecture de violation 0x8BADB618.

S'il existe un gestionnaire pour cette exception, le programme peut être poursuivi en toute sécurité.

Des idées que pourrait-il être?

#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

Je pourrais peut-être dépasser la barrière de la langue ici, mais sans le fichier d'entrée, il est difficile à reproduire. –

+0

Vous pouvez essayer de placer le code incriminé dans un bloc 'try {...} catch (...) {}', mais je pense que vous devriez plutôt trouver la raison de la violation d'accès. Puisque vous avez déjà débogué votre programme, pourriez-vous marquer la ligne dans votre programme qui provoque la violation d'accès? – chtz

Répondre

0

L'accès au tableau dans nuskaitymas peut sortir des limites si elle est suffisamment nombreuses itérations de la boucle while sont exécutés. Envisagez d'utiliser un type de données de taille dynamique tel que std::vector. L'utilisation de std::ifstream peut également être améliorée. Au lieu de !duomenuNuskaitymas.eof(), utilisez !duomenuNuskaitymas. De plus, la fermeture explicite de std::ifstream est inutile. Ceci sera exécuté quand l'objet sort de la portée et que le destructeur est appelé. Enfin, je voudrais vérifier que la lecture de la std::ifstream est réussie. Si ce n'est pas le cas, vous ne parviendrez pas à lire les nouvelles valeurs, tout en incrémentant l'index et en n'atteignant jamais la fin du fichier.