• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja przestała działać [Cpp]

0 głosów
561 wizyt
pytanie zadane 8 czerwca 2018 w C i C++ przez Sansi Użytkownik (720 p.)
void data_check1(students people[], int i )
{
            if(people[i].nrind < 100000 && people[i].nrind > 9999)
    {
                for(int a = 0; a < i; a++)
                {
                    if (people[a].nrind == people[i].nrind)
                    {
                        cout << "Wrong or existing index number" << endl;
                    }
                }

    }
}

Mam taką najprostszą możliwą funkcję na próbę. Wywołuję ją razem z innymi (działającymi) funkcjami.

data_check1(people,i);

Ta tutaj też działała - do momentu wyłączenia komputera. Teraz chociaż wydaje mi się, że nic się nie zmieniło to ona po prostu nie jest widziana. 

Pierwszy if powinien nie pozwalać na wybór liczby spoza przedziału tymczasem wpisuje sobie 123 albo nawet samo 1 i program nie wyświetla komunikatu o błędzie. Tak samo mogę podać 20 razy 1 i też nie widzi problemu. 

Może ktoś podpowiedzieć czego nie zauważam?

1 odpowiedź

0 głosów
odpowiedź 8 czerwca 2018 przez RafalS VIP (122,820 p.)
if(people[i].nrind < 100000 && people[i].nrind > 9999)

Pierwszy if powinien nie pozwalać na wybór liczby spoza przedziału tymczasem wpisuje sobie 123

Wszystko w ty ifie zależy od składnika nrind i-tego studenta z tablicy. Nie sprawdza on przedziału i. Nie pomożemy Ci, bo nie widzimy wartości tej tablicy.

komentarz 8 czerwca 2018 przez Sansi Użytkownik (720 p.)

Funkcja ma sprawdzać dane na wejściu. 

W tym przypadku wpisywany nrind.

cout << "Podaj" << endl;

cin >> people[i].nrind;

data_check1(people,i);

Podaje więc jako pierwszą daną 1.

I program nie widzi błędu, chociaż ma podane, że podawana wartość ma się mieścić w zadanym przedziale. 

Podaję kolejny raz 1. Znowu nie widzi błędu chociaż powinien go wyłapać. 

 

Po rozbiciu warunku na taki 

 

void data_check1(students people[], int i )
{
            if(people[i].nrind > 9999 && people[i].nrind < 100000)
            {
                cout << "not ok" << endl;
            }

                for(int a = 0; a < i; a++)
                {
                    if (people[a].nrind == people[i].nrind)
                    {
                        cout << "Wrong or existing index number" << endl;
                    }
                }

    }

Przy drugim przejściu wyłapuje, że nr się powtarza i wyświetla Wrong...

Ale nie reaguje na pierwszego if'a. 

 

 

komentarz 8 czerwca 2018 przez RafalS VIP (122,820 p.)
            if(people[i].nrind > 9999 && people[i].nrind < 100000)
            {
                cout << "not ok" << endl;
            }

Do tego ifa wejdzie jeśli nrind będzie z przedziału <10 000; 99 999>, jeśli podasz 1 to nic dziwnego ze do niego nie wchodzi.

komentarz 8 czerwca 2018 przez Sansi Użytkownik (720 p.)
No bo właśnie jak podam 1 powinno zgodnie z założeniami wywalać, że błąd. A czy wpisze z zakresu czy nie z zakresu nie dzieje się kompletnie nic.

Nawet jak sobie w if'ie wpisze, że nr bedzie równy 1 i wbije z konsoli 1 to nie wyswietli mi tego co mam w cout. Po prostu ignoruje if'a.

 

A teraz ciekawostka na innym kompie złapało. Działa bez problemu.

Więc teraz pytanie co się stało mojemu kompilatorowi? I jak to naprawić.
komentarz 8 czerwca 2018 przez RafalS VIP (122,820 p.)
Zacznij od wypisnia wszystkiego co się da na początku funkcji. Wypisz i, oraz people[i].nrind.
komentarz 8 czerwca 2018 przez RafalS VIP (122,820 p.)

No bo właśnie jak podam 1 powinno zgodnie z założeniami wywalać, że błąd.

No jak to? Przecież napisałem już, że dla 1 nie wykona nic - czyli nic nie wypisze ani nie wywali.

komentarz 8 czerwca 2018 przez Sansi Użytkownik (720 p.)
Siedzę nad tym od wczoraj od momentu jak przestało cokolwiek wyświetlać. Niezależnie co bym nie dała w tym if'ie nie zrobi się nic. Nawet wpisując w tej funkcji w if (a==1) cout << "nic" i podając z klawiatury cin >> 1; do zmiennej a program po prostu nie zrobi nic. Tak jakby sobie zapomniał , że to się tam znajduje. A na komputerze kogoś innego mam informacje, że kod robi cokolwiek z tym ifem
komentarz 8 czerwca 2018 przez RafalS VIP (122,820 p.)

No to mówię. Zdebuguj program i sprawdz co się dzieje. Wypisz w funkcji zmienne, które porównujesz:

cout<<"i = "<<i<<", people["<<i<<"].nrind = "<<people[i].nrind<<endl;

Dodaj taką linijkę na początku funkcji.

Szansa ze zepsuł Ci się kompilator jest bardzo niewielka.

komentarz 8 czerwca 2018 przez Sansi Użytkownik (720 p.)
A jednak całkiem spora. Wykasowałam program, wyczyściłam rejestr, zainstalowałam ponownie na drugim dysku - funkcja działa.

Dzięki za chęci ;)
komentarz 8 czerwca 2018 przez RafalS VIP (122,820 p.)
:O z ciekawości, czym kompilujesz? Nigdy nie mialem takiego problemu a sporo sie w zyciu kompilowalo :p
komentarz 8 czerwca 2018 przez RafalS VIP (122,820 p.)
Btw nie cieszylbym sie ze dziala, bo moze dzialac przez przypadek. Teraz mi przyszlo do glowy ze to może być problem z wychodzeniem poza zakres tablicy. Gdzie tworzysz tablice people? Jesli i jest poza zakresem to nie ma w tym nic dziwnego ze wartosc people[i].nrind sama sie zmienia.

Podobne pytania

0 głosów
1 odpowiedź 1,088 wizyt
0 głosów
0 odpowiedzi 1,073 wizyt
0 głosów
2 odpowiedzi 393 wizyt
pytanie zadane 16 lutego 2016 w C i C++ przez Exus Początkujący (420 p.)

93,607 zapytań

142,529 odpowiedzi

322,999 komentarzy

63,097 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...