• 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]

VPS Starter Arubacloud
0 głosów
249 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ź 470 wizyt
0 głosów
0 odpowiedzi 694 wizyt
0 głosów
2 odpowiedzi 260 wizyt
pytanie zadane 16 lutego 2016 w C i C++ przez Exus Początkujący (420 p.)

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...