dziwne krzaki i dźwięki po zakończeniu funkcji

2011-09-18 13:32
von_ilnicki
0

witam wszystkich programistów i błagam was o pomoc.
niedawno napisałem kodzik, nawiązujący nieco do mojego pomysłu stąd:

http:4programmers.net/Forum/Newbie[...]h_sie_z_inna_zmienna_string//

Po przerobieniu na moje umiejętności wyszedł taki (poniżej), tylko że po zakończeniu tej funkcji wyskakują w konsoli dziwne krzaki i piski z komputera (screen). Coś się stało?

user image

oto kod:

string PokazHasla(int Ile)
{
    cout << "Najczesciej uzywane zwroty wpisywane z klawiatury:" << endl;
    cout << "UWAGA! Nie wszystkie sa haslami, gdyz moga byc uzywane w innych celach, np. w Googlach!" << endl;
    cout << "-------------------" << endl;

    string tStrings[19], Password;

    int nLogic;

    for (int i = 0; i < Ile; i++) {
        nLogic = rand() % 30 + 1;
        switch (nLogic) {
           case 1: tStrings[i] = "adziobandit"; break;
           case 2: tStrings[i] = "demono"; break;
           case 3: tStrings[i] = "123456"; break;
           case 4: tStrings[i] = "tartakd123456"; break;
           case 5: tStrings[i] = "malgcosia5"; break;
           case 6: tStrings[i] = "impranabcalego"; break;
           case 7: tStrings[i] = "dubfbik"; break;
           case 8: tStrings[i] = "maryna"; break;
           case 9: tStrings[i] = "ifdfgebil"; break;
           case 10: tStrings[i] = "orzeszek"; break;
           case 11: tStrings[i] = "cvbcvby"; break;
           case 12: tStrings[i] = "pfy"; break;
           case 13: tStrings[i] = "vcbx"; break;
           case 14: tStrings[i] = "dlaczegoja"; break;
           case 15: tStrings[i] = "trudnesprawy"; break;
           case 16: tStrings[i] = "heaven-club"; break;
           case 17: tStrings[i] = "dariusz-smyczynski"; break;
           case 18: tStrings[i] = "timtirimti"; break;
           case 19: tStrings[i] = "beethoven"; break;
           case 20: tStrings[i] = "ageofdarknes3"; break;
           case 21: tStrings[i] = "bogus-linda"; break;
           case 22: tStrings[i] = "cvbcvb"; break;
           case 23: tStrings[i] = "ffa"; break;
           case 24: tStrings[i] = "sgsfaj"; break;
           case 25: tStrings[i] = "sdfsgh"; break;
           case 26: tStrings[i] = "mma"; break;
           case 27: tStrings[i] = "ksw"; break;
           case 28: tStrings[i] = "kliczko-adamek"; break;
           case 29: tStrings[i] = "transmisja"; break;
           case 30: tStrings[i] = "hejhej"; break;
           default: cout << "GAME ERROR: nLogic has higher or lower value than cases!" << endl << endl;
        }
    }

    nLogic = rand() % 3 + 1;
    switch (nLogic) {
           case 1: Password = tStrings[Ile - 1];
           case 2: Password = tStrings[Ile - 2];
           case 3: Password = tStrings[Ile - 3];
    }

    for (int x = 0; x < Ile; x++) {
        cout << "^#@.0" << tStrings[x] << "%$z&_";
        if (x != 2 || x != 4 || x != 6 || x != 8 || x != 0) cout << "\n";
    }

    wait(6);

    string PropozycjaH;

    for (int y = 0; y < 3; y++) {
        cout << "" << endl;
        bBlednaKomenda = true;
        cout << "Podaj haslo: (pozostalo prob: " << y + 1 << "/3)" << endl;
        cin >> PropozycjaH;

        if (PropozycjaH == Password) {
                        bBlednaKomenda = false;
                        break;
        }
    }
    if (bBlednaKomenda) Koniec(false, false, "nauki scisle", 100, 51);

    cout << "\n\nUdalo ci sie rozszyfrowac haslo do komputera!" << endl;
}

z kodu można się domyślić, że to gra (dla ciekawskich).

edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-09-18 13:35
Rev
0

Nie analizowałem kodu, ale tego typu efekt na ekranie dostajesz wtedy, gdy próbujesz wypisać napis niezakończony znakiem 0.


Pozostało 580 znaków

2011-09-18 13:38
von_ilnicki
0

wypisać?
z cout'a?

Pozostało 580 znaków

2011-09-18 16:05
0

O ile pamiętam to wymieniłem ci kilka błędów, których jak widzę nie poprawiłeś:

    nLogic = rand() % 3 + 1;
    switch (nLogic) {
           case 1: Password = tStrings[Ile - 1];
           case 2: Password = tStrings[Ile - 2];
           case 3: Password = tStrings[Ile - 3];
    }

Jeśli Ile wynosi 3, jesz 1/3 szans że przekroczysz zakres.

if (x != 2 || x != 4 || x != 6 || x != 8 || x != 0) cout << "\n";

Warunek zawsze prawdziwy (x nie zawsze jest różne od co najmniej jednej z tych liczb)

cout << "" << endl;

Ten "" zupełnie zbędny.

Użyj debuggera, a jeśli nie umiesz, to pobaw się prymitywną metodą debugowania, czyli komentując odpowiednie linie kodu, które nie wpływają na działanie całości, a są potencjalnie błędne, czyli wszystkie couty.

Pozostało 580 znaków

2011-09-18 16:24
von_ilnicki
0

usunąłem to wadliwe if oraz "" i dalej (mimo iż bez pisków i krzaków) kończy się (program przestał działąć)

Powtórzę się jeszcze raz, bo widzę ze do ciebie trzeba coś dwa razy napisać żebyś zrobił: Użyj debuggera, a jeśli nie umiesz, to pobaw się prymitywną metodą debugowania, czyli komentując odpowiednie linie kodu, które nie wpływają na działanie całości, a są potencjalnie błędne, czyli wszystkie couty. - Razi91 2011-09-18 16:43

Pozostało 580 znaków

2011-09-18 16:57
von_ilnicki
0

włączyłem debbugera i w momencie podania poprawnego hasła wyskakuje okno; " błąd segmentacji"

2011-09-18 17:18
0

A skąd przekonanie że to w tej funkcji jest błąd? Może w funkcji "Koniec" jest błąd jakiś?

Pozostało 580 znaków

2011-09-19 21:03
von_ilnicki
0

nie sądzę. usunąłem zbędne couty i patrząc na kod nie widzę w nim niczego szkodliwego (poza tym nieszczęsnym abortem, jednak innego rozwiązania nie widzę (patrz. komentarz do kodu)):

int Koniec(bool bKoniecZycia, bool bExit, string umiejetnosc, unsigned rzut, unsigned prog)
{
    cout << "\n\n------------------------" << endl;
    if (bKoniecZycia == true)
    {
       cout << "KONIEC GRY!" << endl;
       cout << "Punkty zycia bohatera spadly do zera." << endl;
    }
    if (bKoniecZycia == false && bExit == false)
    {
                    cout << "KONIEC GRY!" << endl;
                    cout << "Przegrales w rzutach na " << umiejetnosc << " (Rzut: " << rzut << " > Prog: " << prog << ")" << endl;
    }
    if (bExit == true)
    {
              cout << "KONIEC GRY!" << endl;
              cout << "Uzytkownik zaniechal gry." << endl;
    }
    cout << "------------------------" << endl;

    cin.sync();
    getchar();
    abort();    // abort zamyka program, bo pomysły z getch() nie podziałały i kod dalej się wykonywał. Trzeba było przejść do środków... "brutalnych" :)

    return 0;
}

P.S poza tym gdyby to abort powodował zamknięcie, komunikat byłby inny. I wyświetliłby się w konsoli tekst "This application requested [...]". A tego nie ma. Dlatego z dedukcji wnioskuję iż abort jest niewinny :P

Pozostało 580 znaków

2011-09-19 21:12
0

Pokaż funkcje, która wywołuje funkcje PokazHasla.
Ten kod nie powinien się w ogóle skompilować. Funkcja PokazHasla nic u Ciebie nie zwraca, a powinna zwracać string


Pozostało 580 znaków

2011-09-19 21:15
von_ilnicki
0
  1. w moim programie tylko main wywołuje funkcję PokazHasla(Ile);
  2. pomysł z returnowaniem stringa był na początku i zapomniałem go usunąć. zamiast niego wstawiłem int i na końcu return 0;

o działa. meritum sprawy tkwiło chyba właśnie z braku odp. returnu. Dzięki wielkie społeczności! Mam nadzieję że nie byłem nachalny.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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