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

2011-09-10 09:57
gość
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?

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

Pozostało 580 znaków

2011-09-10 11:34
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ć.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 3x, ostatnio: MasterBLB, 2011-09-10 11:37
To nie jest cały kod, seeda może na początku maina ustawia. Poza tym łatwiej się testuje działanie przy stałym seedzie - Razi91 2011-09-10 12:03
Fakt,seeda ustawia się ino raz zwykle.Tyle,że pokazanym fragmencie kodu nie widać ustawiania i teraz nie wiadomo,czy ustawił go gdzieś indziej czy zapomniał.Sęk w tym,że nawet przy nieustawionym seedzie to powinno dawać dobre przedziały :/ - MasterBLB 2011-09-10 12:15
Bo daje dobre przedziały, switch zabezpieczony niepotrzebnie, chyba że ktoś chce kompilować na kompilatorze bardziej zabugowanym niż MinGW sprzed naszej ery, albo najstarszym Borlandem, który obsługuje do 64KB pamięci. Problem tu był inny: ta pętla nie wykonała się tu ani razu. Gdyby losowany był zły przedział, to wypisałby ten błąd co jest w default. - Razi91 2011-09-10 12:18
W tym właśnie,rzecz,że daje dobre-jak byk stoi w linku co zapodałem jak tego randa używać,aby uzyskiwać liczby z zadanego przedziału,i takie samo użycie jest w pokazanym kodzie. - MasterBLB 2011-09-10 12:23

Pozostało 580 znaków

2011-09-10 12:13
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.

Pozostało 580 znaków

2011-09-10 13:04
gośc
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).

Pozostało 580 znaków

2011-09-10 13:09
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]?

Pozostało 580 znaków

2011-09-10 13:21
gość
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);

Pozostało 580 znaków

2011-09-10 13:33
gość
0

już jest wszystko okej.

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

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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