Pomoc przy funkcji, która nie działa w pełni

0

witam. czy bylibyście tacy mili i podpowiedzieli mi gdzie jest jakiś błąd lub coś, bo gdy uruchamiam tą funkcję (omijam jej deklarację itp.)

string tStrings[19], Password;
    
    for (int i; i < Ile; i++) {
        int nLogic = rand() % 30 + 1;
        switch (nLogic) {
           case 1: tStrings[i] = "jakistamhaslo6"; break;
           case 2: tStrings[i] = "demono"; break;
           case 3: tStrings[i] = "123456"; break;
           case 4: tStrings[i] = "tartak123456"; break;
           case 5: tStrings[i] = "malgosia5"; break;
           case 6: tStrings[i] = "impranacalego"; break;
           case 7: tStrings[i] = "dubik"; break;
           case 8: tStrings[i] = "maryna"; break;
           case 9: tStrings[i] = "jakiestamhaslo8"; break;
           case 10: tStrings[i] = "jakiestamhaslo7"; break;
           case 11: tStrings[i] = "jakiestamhaslo4"; break;
           case 12: tStrings[i] = "proteiny"; break;
           case 13: tStrings[i] = "jakastamhaslo5"; 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] = "costamcostam"; break;
           case 23: tStrings[i] = "jakieshaslo"; break;
           case 24: tStrings[i] = "jakieshaslo2"; break;
           case 25: tStrings[i] = "jakieshaslo3"; 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];
    }
    
    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";
    }
    
    Dalej();
    
    for (int y = 0; y < 3; y++) {
        cout << "Podaj haslo: (pozostalo prob: " << y + 1 << "/3)" << endl;
        string PropozycjaH;
        cin >> PropozycjaH;
        
        if (PropozycjaH == Password) break;
        if (PropozycjaH != Password && y = 2) Koniec(false, false, "nauki scisle", 100, 51);
    }

to po wywołaniu jej nie otrzymuję wykazu tablicy tStrings[] oddzielonych "#@.0" tylko właśnie same "#@.0" .
Co się stało?

0

Łap się za debugger ze swojego IDE,ustaw breakpointa i jedź z pracą krokową programu to w mig będziesz wiedział,gdzie jest błąd.
Mi nie podoba się linijka

int nLogic = rand() % 30 + 1;

powinno działać wg tego co o rand() piszą:
http://www.cplusplus.com/reference/clibrary/cstdlib/rand/
no ale,to jest właśnie słowo klucz-"powinno".Potemu imo bez debuggera się nie obędzie

A i co do rand(),to widzę że seeda nie ustawiasz,to ci jeszcze może bruździć.

0

tString ma 19 komórek, czyli do 18. Zmienna Ile powinna więc wynosić max 19.

W drugim switchu masz coś takiego: case 3: Password = tStrings[Ile];. Komórka o indeksie Ile może nie istnieć (jeśli Ile==19), lub być niezainicjowana: wcześniejsza pętla wsadza tylko do komórek <Ile.

Zmienną nLogic deklarujesz w pętli, a potem chcesz jej użyć poza nią.

i przede wszystkim: grzech śmiertelny: zmienna i w pętli niezainicjowana, czyli z losową wartością na początku: for (int i; i < Ile; i++). Ile wynosi i w pierwszym przebiegu? Nie wiadomo. Raz na miliard uruchomień może być równe 0. Zmienne w C++ są inicjowane na 0 tylko jeśli są globalne, w innym przypadku mają taką wartość jaka tam jest w pamięci aktualnie.

I jeszcze jedno: if (x != 2 || x != 4 || x != 6 || x != 8 || x != 0) cout << "\n"; - ten warunek ZAWSZE będzie spełniony. Jeśli liczba nie jest równa 2 LUB nie jest równa 4, to się kłóci same ze sobą. Jeśli jest równa 2, to spełniony jest drugi warunek. Jeśli 4, to pierwszy. Nie mówię już o pozostałych.

0

do poprzedniego postu: srand umieściłem na początku maina (srand(static_cast<unsigned>(time(NULL)));)

teraz działa prawie wszystko tylko że Password nie przyjmuje żadnej wartości przez co nie da się wygrać. Ważne: password musi mieć stringa o takiej wartości, która występuje w którymś z wymienionych propozycji (jest razem ich 30, co zauważyliście, ale wyświetla się ich na konsoli tylkotyle ile zdefiniowano w wywołaniu jej - zmienna Ile).

0

Jest szansa 1/3 że Password przyjmie wartość komórki tStrings[Ile] która nie istnieje lub nie została zainicjowana, czyli jest pusta. Zmieniłeś z [Ile] na np. [Ile - 3]?

0

Okej, teraz przyjmuje poprawne wartości. A co jest nie tak w tej części, że pętla powtarza się 2x bez możliwośći wpisania do cina czegokolwiek?

for (int y = 0; y < 3; y++) {
        cout << "Podaj haslo: (pozostalo prob: " << y + 1 << "/3)" << endl;
        cin >> PropozycjaH;
        
        if (PropozycjaH == Password) break;
    }
    if (PropozycjaH != Password) Koniec(false, false, "nauki scisle", 100, 51);
0

już jest wszystko okej.

P.S dzięki naprawdę, nigdy nie zawiodłem się na tym forum :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.