1 Востаннє редагувалося muroclav (10.06.2013 07:39:31)

Тема: Проблеми із винятками(пам'яттю)

Є ось такий код

Прихований текст
#include <fstream>
#include <iostream>
#include <cstring>
#include <locale>

  using namespace std;

class payer
{
protected:
     string street;
     int building;
     int flat;
     int account;
     double hot_water;
     double cold_water;
     double gas;
     double heating;
     double lighting;
     double sum;
public:
    payer()
    {}
    payer(string s, int b, int f, int a, double h, double c, double g, double heating, double l)
    {
    street=s; 
    building=b;
    flat=f;
    account=a;
    hot_water=h;
    cold_water=c;
    gas=g;
    heating=heating;
    lighting=l;
    }
};

////////////////////////////////////////
class phpayer : public payer
{
public:
    string name;
    string surname;
    phpayer() : payer()
    {}
    phpayer(string n, string sn) : payer()
    {
      name=n;
      surname=sn;
    }
    void diskIn(int);
    void diskOut();
    static int diskCount();
    int account_return()
    {
        return account;
    }
    void null()
    {
      hot_water=0;
      cold_water=0;
      gas=0;
      heating=0;
      lighting=0;
      sum=0;
    }
    friend ostream &operator<<(ostream &output, phpayer phobj);
    friend istream &operator>>(istream &input, phpayer &phobj);
};

void phpayer::diskIn(int pn)
{
    ifstream infile;
    infile.open("database1.DAT");
    infile.seekg(pn*sizeof(phpayer));
    infile.read( (char*)this, sizeof(*this) );
}
void phpayer::diskOut()
{
    ofstream outfile;
    outfile.open("database1.DAT", ios::app);
    outfile.write((char*)this, sizeof(*this));
}
int phpayer::diskCount()
{
    ifstream infile;
    infile.open("database1.DAT");
    if(!infile) {cout<<"Файл бази даних ще не був створений. "; return 0;}
    else
    {
    infile.seekg(0, ios::end);
    return (int)infile.tellg() / sizeof(phpayer);
    }
}

ostream &operator<<(ostream &output, phpayer phobj)
{
    
        output << '\n' << phobj.name << " ";
        output << phobj.surname << ", ";
        output << phobj.street << ", ";
        output << phobj.building << "/";
        output << phobj.flat << " ";
        // output << phobj.account;
        system("pause");
        system("cls");
        output << "Плата за гарячу воду:" << phobj.hot_water;
        output <<"\nПлата за холодну воду:" << phobj.cold_water;
        output <<"\nПлата за газ:" << phobj.gas;
        output <<"\nПлата за опалення:" << phobj.heating;
        output <<"\nПлата за електроенергію:" << phobj.lighting;
        phobj.sum=phobj.hot_water+phobj.cold_water+phobj.gas+phobj.heating+phobj.lighting;
        output << "Загальна сума:" << phobj.sum << endl;
        return output;
}
istream  &operator>>(istream &input, phpayer &phobj)
    { 
        cout << "Введіть ваші дані. " << endl;
        cout << "Ім'я: "; input >> phobj.name;
        cout << "Прізвище: "; input >> phobj.surname;
        cout << "Вулиця: "; input >> phobj.street;
        cout << "Номер будинку: "; input >> phobj.building;
        cout << "Номер квартири: "; input >> phobj.flat;
        cout << "Номер рахунку: "; input >> phobj.account;
        system("cls");
        cout << phobj.name <<" "  << phobj.surname <<", " << phobj.street <<", " << phobj.building;
        cout <<"\nПлата за гарячу воду:"; input >> phobj.hot_water;
        cout <<"Плата за холодну воду:"; input >> phobj.cold_water;
        cout <<"Плата за газ:"; input >> phobj.gas;
        cout <<"Плата за опалення:"; input >> phobj.heating;
        cout <<"Плата за електроенергію:"; input >> phobj.lighting;
        phobj.sum=phobj.hot_water+phobj.cold_water+phobj.gas+phobj.heating+phobj.lighting;
        cout << "Загальна сума:" << phobj.sum;
        return input;
        
    }

////////////////////////////////////////////
class jpayer : public payer
{
public:
    string organization;
    string name;
    jpayer() : payer()
    {}
    jpayer(string o, string n) : payer()
    {
      organization=o;
      name=n;
    }
    void null()
    {
      hot_water=0;
      cold_water=0;
      gas=0;
      heating=0;
      lighting=0;
      sum=0;
    }
    void diskIn(int);
    void diskOut();
    static int diskCount();
    friend ostream &operator<<(ostream &output, jpayer jobj);
    friend istream &operator>>(istream &input, jpayer &jobj);
    int account_return()
    {
        return account;
    }
};
void jpayer::diskIn(int pn)
{
    ifstream infile;
    infile.open("database2.DAT");
    infile.seekg(pn*sizeof(jpayer));
    infile.read( (char*)this, sizeof(*this) );
}
void jpayer::diskOut()
{
    ofstream outfile;
    outfile.open("database2.DAT", ios::app);
    outfile.write((char*)this, sizeof(*this));
}
int jpayer::diskCount()
{
    ifstream infile;
    infile.open("database2.DAT");
    if(!infile) {cout<<"Файл бази даних ще не був створений"; return 0;}
    else
        {
            infile.seekg(0, ios::end);
            return (int)infile.tellg() / sizeof(jpayer);
         }
}

ostream &operator<<(ostream &output, jpayer jobj)
{
        output << '\n' << jobj.organization << " ";
        output << jobj.name << ",";
        output << jobj.street << ", ";
        output << jobj.building << "/";
        output << jobj.flat << ", ";
        // output << jobj.account  << '\n';
        system("pause");
        system("cls");
        output << "Плата за гарячу воду:" << jobj.hot_water;
        output <<"\nПлата за холодну воду:" << jobj.cold_water;
        output <<"\nПлата за газ:" << jobj.gas;
        output <<"\nПлата за опалення:" << jobj.heating;
        output <<"\nПлата за електроенергію:" << jobj.lighting;
        jobj.sum=jobj.hot_water+jobj.cold_water+jobj.gas+jobj.heating+jobj.lighting;
        output << "Загальна сума:" << jobj.sum << endl;
        return output;
}
istream  &operator>>(istream &input, jpayer &jobj)
    { 
        cout << "Введіть дані. " << endl;
        cout << "Тип огранізації:"; input >> jobj.organization;
        cout << "Назва організації: "; input >> jobj.name;
        cout << "Вулиця: "; input >> jobj.street;
        cout << "Номер будинку: "; input >> jobj.building;
        cout << "Номер квартири: "; input >> jobj.flat;
        cout << "Номер рахунку: "; input >> jobj.account;
        system("cls");
        cout << jobj.organization <<" "  << jobj.name <<", " << jobj.street <<", " << jobj.building;
        cout <<"\nПлата за гарячу воду:"; input >> jobj.hot_water;
        cout <<"Плата за холодну воду:"; input >> jobj.cold_water;
        cout <<"Плата за газ:"; input >> jobj.gas;
        cout <<"Плата за опалення:"; input >> jobj.heating;
        cout <<"Плата за електроенергію:"; input >> jobj.lighting;
        jobj.sum=jobj.hot_water+jobj.cold_water+jobj.gas+jobj.heating+jobj.lighting;
        cout << "Загальна сума:" << jobj.sum;
        return input;
        
    }

////////////////////////////////////////////////////
////////////////////////////////////////////////////
int main()
{
    setlocale(LC_ALL,"RUSSIAN");
    int a;
    char ch;
    while(1)
    {
        system("cls");
        cout << "Зробіть ваш вибір." << endl << " 1 - внести нові дані" << endl << " 2 - переглянути стан рахунку" << endl ;
        cin >> a;
        system("cls");
        switch(a)
        {
        case 1:
            { 
            do
            {
            cout << "Додати платників: \n" << "1-фізична особа; \n" <<  "2-юридична особа \n";
            cin >> a;
            switch(a)
            {
            case 1: 
                    {
                         int n = phpayer::diskCount();
                         cout <<"В базі даних " << n << " фізичних користувачів\n";
                         phpayer phobj;
                         cin >> phobj; phobj.diskOut();
                         system("pause");
                         break;
                    }
            case 2: 
                    {
                         int n = jpayer::diskCount();
                         cout <<"В базі даних " << n << " юридичних користувачів\n";
                         jpayer jobj;
                         cin >> jobj; jobj.diskOut();
                         system("pause");
                         break;

                    }
            }
 cout<<"Продовжити (y/n)"; cin >> ch; system("cls");}
            while(ch=='y'); break;}
        case 2: { cout << "Зробіть Ваш вибір:\n";
                  cout << "1-фізична особа; \n" << "2-юридична особа; \n";
                  cin >> a;
                  switch(a)
                  {
                  case 1:{
                      string name;
                      int number, n, k=0, m=0;
                      cout << "Введіть Ваше ім'я\n";
                      cin >> name;
                      cout << "Введіть № вашого персонального рахунку\n";
                      cin >> number;
                      phpayer phobj;
                      n= phpayer::diskCount();
                      for(int i=0; i<n; i++)
                        {
                          phobj.diskIn(i);
                           if(phobj.name==name && phobj.account_return()==number)
                            {
                                k++;
                                m=i;
                            }
                        };
                          if(k==1)
                            {
                                system("pause");
                               phobj.diskIn(m);
                               cout << phobj;
                               cout << "1-оплатити послуги; \n" << "0-вихід\n";
                               int j;
                               cin >> j;
                                switch(j)
                                {
                                case 1:
                                    {
                                        cout << "Введіть номер вашого банківського рахунку.\n";
                                        int check;
                                        cin >> check;
                                        phobj.null();
                                        phobj.diskOut();
                                        cout << "Дякуємо за користування терміналом!";
                                        system("pause");
                                        break;
                                    }
                                case 0:
                                    {
                                        break;
                                    }
                                default: 
                                    {
                                        cout << "Не правильний ввід.";
                                        return 0;
                                    }
                                }
                            }
                            else if(k==2){ cout << "Ви уже сплачували за комунальні послуги у цьому місяці.\n"; system("pause");break;}
                            else { cout << "На жаль Вас немає у базі даних, або Ви ввели неправильні дані.\n"; system("pause");break;}
                      }
                 case 2:{
                      jpayer obj;
                      string name;
                      int account;
                      cout << "Введіть назву організації\n";
                      cin >> name;
                      cout << "Введіть № рахунку\n ";  
                      cin >> account;
                      int k, n=0, l=0;
                      k = jpayer::diskCount();
                      for(int i=0; i<k; i++)
                      {
                          obj.diskIn(i);
                          if(obj.name==name && obj.account_return()==account)
                          {
                             n++;
                             l=i;
                          }
                      }
                      if(k==1)
                      {
                         obj.diskIn(l);
                         cout << obj;
                         cout << "1-оплатити послуги; \n" << "0-вихід\n";
                               int j;
                               cin >> j;
                                switch(j)
                                {
                                case 1:
                                    {
                                        cout << "Введіть номер вашого банківського рахунку.\n";
                                        int check;
                                        cin >> check;
                                        obj.null();
                                        obj.diskOut();
                                        cout << "Дякуємо за користування терміналом!";
                                        system("pause");
                                        break;
                                    }
                                case 0:
                                    {
                                        break;
                                    }
                                default: 
                                    {
                                        cout << "Не правильний ввід.";
                                        return 0;
                                    }
                                }
                            }
                            else if(k==2){ cout << "Ви уже сплачували за комунальні послуги у цьому місяці.\n"; system("pause");break;}
                            else { cout << "На жаль Вас немає у базі даних, або Ви ввели неправильні дані.\n"; system("pause");break;}
                      }
                        break;
                    }
                         system("pause");
                  }
                }
        }
    system("pause");
 return 0;
}
}

він ще не повністю дороблений...
в мене зараз він вилітає на 262-268 рядках, тобто до "іфу" не доходить...
Власне сама помилка

Прихований текст

Необработанное исключение типа "System.AccessViolationException" произошло в Програма1.exe

Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.

Програма хоч якось "працює" тільки тоді, коли у файлі є тільки один запис, коли білше - вилітає...
Прошу не звертати увагу на цілу купу не доцільних речей в коді...
Вибачаюся за оформлення коду...
Підкажіть будь ласка, що потрібно виправити, щоб програма працювала нормально...

2 Востаннє редагувалося Chemist-i (09.06.2013 23:47:26)

Re: Проблеми із винятками(пам'яттю)

рядок 259;

for(i=0; i<n; i++)

замініть на

for(int i=0; i<n; i++)

та спробуйте

Подякували: muroclav, koala2

3

Re: Проблеми із винятками(пам'яттю)

Chemist-i, дякую

Прихований текст

круто вбив 3 години шукаючи помилку, а тут таке)

Якщо не важко, поясніть будь ласка, чого так трапилося а то я не дуже розумію що саме змінилося і при чому тут пам'ять, або ткніть носом де про це можна почитати.

4

Re: Проблеми із винятками(пам'яттю)

muroclav
Це все, як сказав один колишній PHP програміст - black magic.
Десь та "і" у вас звільнюється (звісно я весь код не читав), але думаю Вам сюди:
http://cppstudio.com/uchebniki/yazyk-pr … l-for-v-c/

5

Re: Проблеми із винятками(пам'яттю)

Chemist-i написав:

рядок 259;

for(i=0; i<n; i++)

замініть на

for(int i=0; i<n; i++)

та спробуйте

жесть)))
не дарма, значить, в мене це в привичку входить)

6

Re: Проблеми із винятками(пам'яттю)

Краще оголошувати змінні поближче до їх використання. Так і проблем буде менше і читати код легше.

Подякували: muroclav, koala2

7

Re: Проблеми із винятками(пам'яттю)

Cyan написав:

значить, в мене це в привичку входить

А що саме?

8 Востаннє редагувалося Replace (10.06.2013 00:10:56)

Re: Проблеми із винятками(пам'яттю)

Використовувати 2-й варіант мабуть =)
P.S. під маком все файно працює =)

9

Re: Проблеми із винятками(пам'яттю)

Replace
До речі, autoHotKey допомагає в цьому, можна за це не думати взагалі

10

Re: Проблеми із винятками(пам'яттю)

Replace написав:

Краще оголошувати змінні поближче до їх використання. Так і проблем буде менше і читати код легше.

дякую за пораду, візьму до уваги, просто це перша моя програма такого маштабу, тому раніше й не звертав уваги на це)

Cyan написав:

жесть)))
не дарма, значить, в мене це в привичку входить)

пора мабуть й мені привикати...

11

Re: Проблеми із винятками(пам'яттю)

після виправлення, програма вилітає з тією самою помилкою, але вже після розгалуження (рядки 304-338)...

12

Re: Проблеми із винятками(пам'яттю)

Chemist-i написав:
Cyan написав:

значить, в мене це в привичку входить

А що саме?

Replace написав:

Використовувати 2-й варіант мабуть =)

ну так)
мені просто ліньки оголошувати всі змінні спочатку, тим паче, коли пишу щось велике, я до кінця не знаю, які змінні буду використовували

muroclav написав:

пора мабуть й мені привикати...

це те, що приходить з досвідом