I am writing a program that's supposed to read data from a file which you can then use or modify depending on which choice the user picks, using dynamic arrays and pointers. My problem is that the code builds just fine on code::blocks
, but when I try to run it it instantly crashes and only returns "Process returned -1073741819 (0xC0000005)"
which seems to be an access violation. No other errors are shown.
I suspect it's some issue related to the copy constructors but I can't figure out exactly what's wrong, even after spending several hours trying to find the issue. I'm really new to C++, pointers and dynamic arrays especially, so I've probably messed up some implementation somewhere.
How can I fix this?
#include <string>
#include <cctype>
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
const int MAX_KOMPISAR = 10;
const int MAX_PERSONER = 10;
const int MAX_TRANSAKTIONER = 30;
class Person
{
private:
string namn;
double betalat_andras;
double skyldig;
public:
Person();
Person(string n, double b, double s);
double haemta_betalat();
double haemta_skyldig();
string haemta_namn();
void skrivUt();
};
class PersonLista
{
private:
int antal_pers;
Person* pers;
public:
PersonLista();
~PersonLista();
PersonLista& operator=(const PersonLista& p);
void laggTillEn(Person pny);
void skrivUtOchFixa();
double summaSkyldig();
double summaBetalat();
bool finnsPerson(const string& namn);
};
class Transaktion
{
private:
string datum;
string typ;
string namn;
double belopp;
int ant_kompisar;
string* kompisar;
public:
Transaktion();
~Transaktion();
Transaktion& operator=(const Transaktion& t);
string haemta_namn();
double haemta_belopp();
double haemta_skyldig(string namn);
int haemta_ant_kompisar();
bool laesEnTrans(istream& is);
void skrivEnTrans(ostream& os);
bool finnsKompis(string namn);
};
class TransaktionsLista
{
private:
Transaktion* trans;
int antalTrans;
Transaktion t;
public:
TransaktionsLista();
~TransaktionsLista();
void laesin(istream& is);
void skrivut(ostream& os);
void laggTill(Transaktion& t);
double totalkostnad();
double liggerUteMed(string namn);
double aerSkyldig(string namn);
PersonLista FixaPersoner();
};
int main()
{
TransaktionsLista nyTransLista;
PersonLista persList;
Transaktion nyTrans;
Person pers;
Transaktion* trans = 0;
string namn;
int meny_val = -1;
ifstream fil("resa.txt");
nyTransLista.laesin(fil);
fil.close();
ifstream is("resa.txt");
ofstream os("resa.txt");
while (meny_val != 0)
{
cout << "\n0. Avsluta. Alla transaktioner sparas pa fil." << endl;
cout << "1. Las in en transaktion fran tangentbordet." << endl;
cout << "2. Skriv ut information om alla transaktioner." << endl;
cout << "3. Berakna totala kostnaden." << endl;
cout << "4. Hur mycket ar en viss person skyldig?" << endl;
cout << "5. Hur mycket ligger en viss person ute med?" << endl;
cout << "6. Lista alla personer mm och FIXA!!!" << endl;
cin >> meny_val;
if (meny_val == 0)
{
nyTransLista.skrivut(os);
}
if (meny_val == 1)
{
cout << "\nSkriv in datum, vilken typ av utgift , betalarens namn, belopp, antal samt namnen på kompisarna." << endl;
nyTrans.laesEnTrans(cin);
nyTransLista.laggTill(nyTrans);
}
if (meny_val == 2)
{
nyTransLista.skrivut(cout);
}
if (meny_val == 3)
{
cout << "\nDen totala skulden är: " << nyTransLista.totalkostnad() << endl;
}
if (meny_val == 4)
{
cout << "\nAnge namn: " << endl;
cin >> namn;
cout << namn << " ar skyldig " << nyTransLista.aerSkyldig(namn) << endl;
}
if (meny_val == 5)
{
cout << "\nSkriv in namn: " << endl;
cin >> namn;
cout << namn << " ligger ute med " << nyTransLista.liggerUteMed(namn) << endl;
}
if (meny_val == 6)
{
cout << "Nu skapar vi en personarray och reder ut det hela!\n" << endl;
persList = nyTransLista.FixaPersoner();
persList.skrivUtOchFixa();
}
}
return 0;
}
Person::Person()
{
namn = "";
skyldig = 0.00;
betalat_andras = 0.00;
}
Person::Person(string n, double b, double s)
{
namn = n;
betalat_andras = b;
skyldig = s;
}
double Person::haemta_betalat()
{
return betalat_andras;
}
double Person::haemta_skyldig()
{
return skyldig;
}
string Person::haemta_namn()
{
return namn;
}
void Person::skrivUt()
{
if (betalat_andras > skyldig)
{
cout << namn << " ligger ute med " << betalat_andras << " och ar skyldig " << skyldig << ". Skall ha " << betalat_andras - skyldig << " fran potten!" << endl;
}
else
{
cout << namn << " ligger ute med " << betalat_andras << " och ar skyldig " << skyldig << ". Skall lagga " << skyldig - betalat_andras << " till potten!" << endl;
}
}
PersonLista::PersonLista() //konstruktor
: antal_pers(0), pers(0)
{
}
PersonLista::~PersonLista() //destruktor
{
delete[] pers;
pers = 0;
}
PersonLista& PersonLista::operator=(const PersonLista& p)
{
if (this != &p)
{
antal_pers = p.antal_pers;
pers = new Person[antal_pers];
for (int i = 0; i < antal_pers; i++)
pers[i] = p.pers[i];
}
return *this;
}
void PersonLista::laggTillEn(Person pny)
{
Person* tempPers = 0;
tempPers = new Person[antal_pers + 1];
for (int i = 0; i < antal_pers; i++)
{
tempPers[i] = pers[i];
}
if (antal_pers > 0)
{
delete[] pers;
}
pers = tempPers;
antal_pers++;
pers[antal_pers - 1] = pny;
}
void PersonLista::skrivUtOchFixa()
{
for (int i = 0; i < antal_pers; i++)
{
pers[i].skrivUt();
}
}
double PersonLista::summaSkyldig()
{
double skyldig = 0.00;
for (int i = 0; i < antal_pers; i++)
{
skyldig += pers[i].haemta_skyldig();
}
return skyldig;
}
double PersonLista::summaBetalat()
{
double betalat = 0.00;
for (int i = 0; i < antal_pers; i++)
{
betalat += pers[i].haemta_betalat();
}
return betalat;
}
bool PersonLista::finnsPerson(const string& namn)
{
for (int i = 0; i < MAX_PERSONER; i++)
{
if (pers[i].haemta_namn() == namn)
{
return true;
}
}
return false;
}
Transaktion::Transaktion() //konstruktor
: datum(""), typ(""), namn(""), belopp(), ant_kompisar()
{
}
Transaktion& Transaktion::operator=(const Transaktion& t)
{
if (this != &t)
{
delete[] kompisar;
datum = t.datum;
typ = t.typ;
namn = t.namn;
belopp = t.belopp;
ant_kompisar = t.ant_kompisar;
kompisar = new string[ant_kompisar];
for (int i = 0; i < ant_kompisar; i++)
kompisar[i] = t.kompisar[i];
}
return *this;
}
Transaktion::~Transaktion() //destruktor
{
delete[] kompisar;
kompisar = 0;
}
string Transaktion::haemta_namn()
{
return namn;
}
double Transaktion::haemta_belopp()
{
return belopp;
}
int Transaktion::haemta_ant_kompisar()
{
return ant_kompisar;
}
double Transaktion::haemta_skyldig(string namn)
{
double skuld = 0.00;
for (int i = 0; i < ant_kompisar; i++)
{
if (kompisar[i] == namn)
{
skuld = belopp / (ant_kompisar + 1);
}
}
return skuld;
}
bool Transaktion::finnsKompis(string namn)
{
for (int i = 0; i < MAX_KOMPISAR; i++)
{
if (kompisar[i].find(namn, 0) != std::string::npos)
return true;
}
return false;
}
bool Transaktion::laesEnTrans(istream& is)
{
is >> datum >> typ >> namn >> belopp >> ant_kompisar;
for (int i = 0; i < ant_kompisar; i++)
is >> kompisar[i];
return !is.eof();
}
void Transaktion::skrivEnTrans(ostream& os)
{
os << datum << "\t" << typ << "\t" << namn << "\t" << belopp << "\t" << ant_kompisar
<< "\t";
for (int i = 0; i < ant_kompisar; i++)
os << kompisar[i] << "\t";
os << endl;
}
TransaktionsLista::TransaktionsLista()
: trans(0), antalTrans(0)
{
}
TransaktionsLista::~TransaktionsLista()
{
delete[] trans;
trans = 0;
}
void TransaktionsLista::laesin(istream& is)
{
Transaktion t;
while (t.laesEnTrans(is))
{
laggTill(t);
}
}
void TransaktionsLista::skrivut(ostream& os)
{
for (int i = 0; i < antalTrans; i++)
{
trans[i].skrivEnTrans(os);
}
}
void TransaktionsLista::laggTill(Transaktion& t)
{
Transaktion* temp = 0;
temp = new Transaktion[antalTrans + 1];
for (int i = 0; i < antalTrans; i++)
{
temp[i] = trans[i];
}
if (antalTrans > 0)
{
delete[] trans;
}
trans = temp;
antalTrans++;
trans[antalTrans - 1] = t;
}
double TransaktionsLista::totalkostnad()
{
double totalkostnad = 0.00;
for (int i = 0; i < antalTrans; i++)
{
totalkostnad += trans[i].haemta_belopp();
}
return totalkostnad;
}
double TransaktionsLista::liggerUteMed(string namn)
{
double betalat = 0.00;
for (int i = 0; i < antalTrans; i++)
{
if (trans[i].haemta_namn() == namn)
betalat += (trans[i].haemta_belopp() - (trans[i].haemta_belopp() /
(trans[i].haemta_ant_kompisar() + 1)));
}
return betalat;
}
double TransaktionsLista::aerSkyldig(string namn)
{
double skyldig = 0.00;
for (int i = 0; i < antalTrans; i++)
{
if (trans[i].finnsKompis(namn))
skyldig += trans[i].haemta_skyldig(namn);
}
return skyldig;
}
PersonLista TransaktionsLista::FixaPersoner()
{
PersonLista perslista;
string namn_person;
double skuld_person;
double betalat_person;
for (int i = 0; i < antalTrans; i++)
{
if (!perslista.finnsPerson(trans[i].haemta_namn()))
{
namn_person = trans[i].haemta_namn();
skuld_person = +aerSkyldig(namn_person);
betalat_person = +liggerUteMed(namn_person);
Person nypers = Person(namn_person, betalat_person, skuld_person);
perslista.laggTillEn(nypers);
}
}
return perslista;
}
User contributions licensed under CC BY-SA 3.0