Wątek przeniesiony 2015-08-19 16:52 z C/C++ przez ŁF.

Nie wiem dlaczego aplikacja się wysypuje

0

Piszę prosty symulator bankomatu w konsoli i program niespodziewanie się sypie podczas logowania, a w obecnym etapie powinien wrócić do menu bankomatu. Pomoże ktoś? Prawdopodobnie sypie się coś na poziome wczytywania danych do tablic.

main.cpp

 #include <iostream>
#include "naglowki.h"

using namespace std;

int main()
{
    while(true)
    {
        Bankomat bank;
        bank.pokaz();
    }


    return 0;
}

naglowki.h

#include <iostream>

using namespace std;

class Bankomat
{
    int PIN_do_rejestracji, ilosc_klientow;
    int *PINy, *StanyKont;

public:
    void pokaz();
    void zaloguj();
    void zarejestruj();
    void proceslogowania();
    void procesrejestracji();
    void wczytajiloscklientow();
    void zapisziloscklientow();
};
 

menubankomatu.cpp

 #include <iostream>
#include "naglowki.h"
#include <windows.h>
#include <conio.h>

using namespace std;

void Bankomat::pokaz()
{
    char wybor;

    while(true)
    {
        system("cls");
        cout << "Witaj w banku!" << endl << endl;

        cout << "1. Zaloguj" << endl;
        cout << "2. Zarejestruj" << endl << endl;

        cout << "Wybor: ";
        wybor = getch();

        switch(wybor)
        {
        case '1':
            {
                zaloguj();
                break;
            }
        case '2':
            {
                zarejestruj();
                break;
            }
        default:
            {
                system("cls");
                cout << "Podaj cyfre '1' lub '2'!";
                Sleep(2000);
            }
        }
    }
}

funkcjebankomatu.cpp

#include <iostream>
#include "naglowki.h"
#include <windows.h>
#include <sstream>
#include <stdio.h>

using namespace std;

void Bankomat::zaloguj()
{
    int PIN;

    while(true)
    {
        system("cls");

        cout << "\t" << "LOGOWANIE" << endl << endl;
        cout << "Podaj PIN: ";

        if(!(cin>>PIN))
        {
            system("cls");
            cout << "Podaj czterocyfrowy PIN!";
            cin.clear();
            cin.sync();
            Sleep(2000);
        }
        else
        {
            int dlugosc;
            ostringstream ss;

            ss << PIN;
            string PINstring = ss.str();
            dlugosc = PINstring.length();
            ss.str("");

            if((dlugosc > 4) || (dlugosc < 4))
            {
                system("cls");
                cout << "PIN posiada 4 cyfry!";
                cin.clear();
                cin.sync();
                Sleep(2000);
            }
            else
            {
                system("cls");
                proceslogowania();
                break;
            }
        }
    }
}

void Bankomat::zarejestruj()
{
    while(true)
    {
        system("cls");

        cout << "\t" << "REJESTRACJA" << endl << endl;
        cout << "Podaj PIN do rejestracji: ";

        if(!(cin>>PIN_do_rejestracji))
        {
            system("cls");
            cout << "Podaj czterocyfrowy PIN!";
            cin.clear();
            cin.sync();
            Sleep(2000);
        }
        else
        {
            int dlugosc;
            ostringstream ss;

            ss << PIN_do_rejestracji;
            string PINstring = ss.str();
            dlugosc = PINstring.length();
            ss.str("");

            if((dlugosc > 4) || (dlugosc < 4))
            {
                system("cls");
                cout << "PIN posiada 4 cyfry!";
                cin.clear();
                cin.sync();
                Sleep(2000);
            }
            else
            {
                system("cls");
                procesrejestracji();
                break;
            }
        }
    }
}
 

logowanieirejestracja.cpp

#include <iostream>
#include "naglowki.h"
#include <fstream>
#include <windows.h>

using namespace std;

void Bankomat::proceslogowania()
{
    fstream plik;

    wczytajiloscklientow();

    PINy = new int[ilosc_klientow];
    StanyKont = new int[ilosc_klientow];

    plik.open("uzytkownicy.txt", ios::in);
    if(plik.good() == false)
    {
        system("cls");
        cout << "Blad polaczenia z baza danych!";
        Sleep(2000);
    }
    else
    {
        int nr_linii = 1;
        string linia;
        int licznik = 0;

        while(getline(plik, linia))
        {
            switch(nr_linii)
            {
            case 1:
                {
                    PINy[licznik] = atoi(linia.c_str());
                    licznik++;
                }
            }
            if(nr_linii == 2)
            {
                nr_linii = 0;
            }
            nr_linii++;
        }
        plik.clear();
        plik.close();

        plik.open("uzytkownicy.txt", ios::in);
        if(plik.good() == false)
        {
            system("cls");
            cout << "Blad polaczenia z baza danych!";
            Sleep(2000);
        }
        else
        {
            int nr_linii2 = 1;
            string linia2;
            int licznik2 = 0;

            while(getline(plik, linia2))
            {
                switch(nr_linii2)
                {
                case 2:
                    {
                        StanyKont[licznik2] = atoi(linia2.c_str());
                        licznik2++;
                    }
                }
                if(nr_linii2 == 2)
                {
                    nr_linii2 = 0;
                }
                nr_linii2++;
            }
            plik.clear();
            plik.close();
        }
    }
}

void Bankomat::procesrejestracji()
{
    fstream plik;

    wczytajiloscklientow();

    plik.open("uzytkownicy.txt", ios::out | ios::app);
    if(plik.good() == false)
    {
        system("cls");
        cout << "Blad polaczenia z baza danych!";
        Sleep(2000);
    }
    else
    {
        int PoczatkowyStanKonta = 0;

        plik << PIN_do_rejestracji << endl;
        plik << PoczatkowyStanKonta << endl;

        ilosc_klientow++;
    }
    plik.close();

    zapisziloscklientow();
}
 

iloscklientow.cpp

 #include <iostream>
#include "naglowki.h"
#include <fstream>
#include <windows.h>

using namespace std;

void Bankomat::wczytajiloscklientow()
{
    fstream plik;

    plik.open("iloscklientow.txt", ios::in);
    if(plik.good() == false)
    {
        system("cls");
        cout << "Blad polaczenia z baza danych!";
        Sleep(2000);
    }
    else
    {
        int nr_linii = 1;
        string linia;

        while(getline(plik, linia))
        {
            switch(nr_linii)
            {
            case 1:
                {
                    ilosc_klientow = atoi(linia.c_str());
                }
            }
        }
        plik.close();
    }
}

void Bankomat::zapisziloscklientow()
{
    fstream plik;

    plik.open("iloscklientow.txt", ios::out);
    if(plik.good() == false)
    {
        system("cls");
        cout << "Blad polacznie z baza danych!";
        Sleep(2000);
    }
    else
    {
        plik << ilosc_klientow;
    }
    plik.close();
}
0

Załóż jeszcze ze 3 tematy z tym samym kodem i problemem. Zapomnij sie w kodzie debugerem, nikt tego za ciebie nie będzie robił.

0

Nie czytałem całego kodu ale alokujesz pamięć tu

    PINy = new int[ilosc_klientow];
    StanyKont = new int[ilosc_klientow];

a nigdzie jej nie zwalniasz.
// edit
A tak własciwie jeśli jescze dobrze sie wskaźnikami nie umiesz posłużyć, użyj vector-a, oszczędzi Ci to nerwów.

0

Odpal debuggera, przeleć po programie krok po kroku, napisz w której linii program się wysypuje to Ci powiemy dlaczego tak się dzieje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1