Wątek przeniesiony 2015-12-29 19:10 z C/C++ przez ŁF.

Wskaźniki zawieszają konsole

0

Mam problem z logowaniem klienta. Jest jakiś problem ze wskaźnikiem, ale nie wiem o co chodzi, bo nie do końca rozumiem działanie wskaźników. Błąd pojawia się w 60 linii(chodzi o wywołanie funkcji

proces_logowania(&PIN, client)

) funkcji logowanie i 59-61 linii(chodzi o przypisanie w zmiennych na wskaźniku obj -> _PIN = *PIN;obj -> _Stan_konta = StanyKont[i];obj -> _index = i;

 funkcji proces_logowania. Efektem tego jest zawieszenie konsoli. Problem jest w miejscach, gdzie wskazuję wskaźnikiem 'obj ->' na zmienne klasy Klient w funkcji proces_logowania, linie 59-61..

logowanierejestracja.cpp

```cpp
void Bankomat::logowanie(Klient* &client)
{
    int PIN;

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

        cin.clear();
        cin.sync();

        cout << "===== LOGOWANIE =====";

        if(proby < 3 && proby > 0)
        {
            cout << "          Pozostaly " << proby << " proby!";
        }
        else if(proby == 0)
        {
            system("cls");

            for(int i = 60; i >= 0; i--)
            {
                system("cls");
                cout << "Probowano zalogowac sie zbyt duzo razy! Poczekaj " << i << " sek!";
                Sleep(1000);
            }

            proby = 3;
        }

        cout << endl << endl;
        cout << "Podaj PIN: ";
        cin >> PIN;

        ostringstream ss;
        ss << PIN;
        string stringPIN = ss.str();
        int dlugosc = stringPIN.length();
        ss.str("");

        if(!PIN)
        {
            cout << endl << endl;

            cout << "Podaj cztery cyfry!";
            Sleep(2000);
            proby--;
        }
        else if(dlugosc < 4 || dlugosc > 4)
        {
            cout << endl << endl;

            cout << "PIN musi posiadac cztery cyfry!";
            Sleep(2000);
            proby--;
        }
        else
        {
            proces_logowania(&PIN, client);
            break;
        }
    }
}

proceslogowaniarejestracji.cpp

void Bankomat::proces_logowania(int *PIN, Klient * obj)
{
    fstream plik;
 
    plik.open("klienci.txt", ios::in);
 
    if(plik.good() == false)
    {
        system("cls");
 
        cout << "Blad polaczenia z baza danych!";
        Sleep(2000);
    }
    else
    {
        wczytaj_ilosc_klientow();
 
        int *PINy = new int[ilosc_klientow];
        int *StanyKont = new int[ilosc_klientow];
 
        int nr_linii = 1;
        string linia;
        int licznik = 0, licznik2 = 0;
 
        while(getline(plik, linia))
        {
            switch(nr_linii)
            {
            case 1:
                {
                    PINy[licznik] = atoi(linia.c_str());
                    licznik++;
                    break;
                }
            case 2:
                {
                    StanyKont[licznik2] = atoi(linia.c_str());
                    licznik2++;
                    break;
                }
            }
 
            if(nr_linii == 2)
            {
                nr_linii = 0;
            }
            nr_linii++;
        }
 
        int licznik_klientow = 0;
 
        plik.close();
        plik.clear();
 
        for(int i = 0; i < ilosc_klientow; i++)
        {
            if(*PIN == PINy[i])
            {
                obj -> _PIN = *PIN;
                obj -> _Stan_konta = StanyKont[i];
                obj -> _index = i;
 
                delete[] PINy;
                delete[] StanyKont;
 
                for(int j = 3; j > 0; j--)
                {
                    system("cls");
                    cout << "Za " << j << " sek. nastapi przekierowanie...";
                    Sleep(1000);
                }
            }
            else
            {
                licznik_klientow++;
            }
        }
 
        if(licznik_klientow == ilosc_klientow)
        {
            cout << endl << endl;
 
            cout << "Brak podane PINu w bazie danych!";
            proby--;
            Sleep(2000);
        }
    }
}
0

Jestem początkujący w sumie i wolałbym żeby ktoś potwierdził to co pisze, ale:

void Bankomat::logowanie(Klient* &client) 

oraz

void Bankomat::proces_logowania(int *PIN, Klient * obj) 

A teraz wywołanie funkcji:

proces_logowania(&PIN, client); 

Nie wiem co oznacza

* & 

bo nigdy sie z tym nie spotkałem, ale chyba te znaki znoszą siebie nawzajem i masz po prostu (Klient klient)

 Jeżeli chcesz w funkcji przekazać w argumencie wskaźnik, to zrób:
```cpp
void Bankomat::logowanie(Klient *client) 

i wtedy będzie ok lub jeśli wolisz zostawić:

void Bankomat::logowanie(Klient* &client)

to wtedy pamietaj, że musisz do funkcji void Bankomat::proces_logowania(int *PIN, Klient * obj)

 przekazać adres objektu a nie objekt jak Ty to robisz.

Ale lepiej żeby ktoś jeszcze się wypowiedział.
0

Hm. Skoro piszesz, że wskaźniki zawieszają Ci konsolę to może przekazujesz do pierwszej funkcji pusty wskaźnik. Zrób obsługę wyjątku i się dowiedz.

0

@Jonki1997 brawo, domyślasz się ze problem jest ze wskaźnikiem client ale nie pokazałeś co ty do tej funkcji przekazujesz :D masa kodu, tylko nie na temat ;]

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