2016-11-19 16 views
-1

は私がプログラムを作って、私はデバッグするときにそれがクラッシュし、私にエラーを示しています。Project1.exeの中0x0FC93AA8(vcruntime140d.dll)で投げC++例外のスロー

例外:0xc0000005で:アクセス違反読み取り場所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からの読み込みが成功したことを確認します。そうでない場合は、新しい値を読み込むと同時にインデックスをインクリメントし、ファイルの最後には到達しません。

関連する問題