Skocz do zawartości


Zdjęcie

[C++] Bug w programie


  • Zamknięty Temat jest zamknięty
4 odpowiedzi w tym temacie

#1 Chinka

Chinka

    Seal of Approval

  • 426 postów

Napisano 26 12 2008 - 22:50

Napisałem program na Multi Lotka. Problem tkwi w tym, że jeśli mam warunki znajdujące się w pętli, na przykład takiej:

for(;;)
	{
	cin >> x;
	if(x<1 || x>10)
	{
		cout << "Nieprawidlowa ilosc typowanych liczb. Wpisz jeszcze raz\n";
		continue;
	}
	else break;
	}

I wpiszę w miejsce zmiennej x [typu int] wartość, która jako tako nie jest typem int, na przykład "d" , to wartość prawdziwa tego warunku powtarza się w nieskończoność (napis na przykład o nieprawidłowej ilości powtarza się dopóki nie zamknę programu). Jak zrobić, aby zachowało się to tak jak należy. (wyświetliło napis i umożliwiło wpisanie x-a jeszcze raz). Żeby nie było, jeśli x=24, warunek działa poprawnie.

  • 0

#2 Trivelt

Trivelt

    Unix fan

  • 406 postów

Napisano 26 12 2008 - 23:00

Zapoznaj się z tym wątkiem.

  • 0

#3 Chinka

Chinka

    Seal of Approval

  • 426 postów

Napisano 27 12 2008 - 00:58

for(;;)
	{
	cin >> x;
	if(typeid(x)!=typeid(int))
	{
	 cout << "Zly typ danych. Podaj jeszcze raz";
	 continue;
	}
	else if(x<1 || x>10)
	{
		cout << "Nieprawidlowa ilosc typowanych liczb. Wpisz jeszcze raz\n";
		continue;
	}
	else break;
	}

Teraz warunek działa, tylko pozostaje problem, że nie może przestać wyświetlać tego komunikatu - czyli zachowuje się tak, jakby nie nadpisywał tej zmiennej (to jest nie wykonywał instrukcji z początku pętli). Próbowałem czyszczenia pamięci przeznaczonej na tę zmienną, jednak funkcja memset nie daje rady (umieszczałem ją między komunikatem a instrukcją continue, na początku pętli też jest źle).

EDIT: Odkryłem dziwne zjawisko. Program sam rozpoznaje typ zmiennej, więc stosowanie typeid jest zbędne. Czyli kod może wyglądać jak pierwotnie. Problem jednak tkwi w tym, że jeśli wpiszemy nie taki typ do zmiennej, nie zwolni ona pamięci przeznaczonej na tę zmienną(przynajmniej na to wygląda).

EDIT 2: Znalazłem skuteczne rozwiązanie. Problemem było zapchanie strumienia cin. Prawidłowy kod wygląda tak(a dokładnie jego fragment):
for(;;)
	{
	cin >> x;
	if(x<1 || x>10)
	{
		cout << "Nieprawidlowa ilosc typowanych liczb. Wpisz jeszcze raz\n";
		cin.clear();
		cin.ignore(INT_MAX,'\n'); //-----należy dodać #include<limits.h>
	}
	else break;
	}

Teraz program się nie zapętla, a dziękuję za naprowadzenie na dobrą drogę.
  • 0

#4 fernandez

fernandez

    150% normy

  • 1 866 postów

Napisano 27 12 2008 - 15:02

Problemem było zapchanie strumienia cin.


co chcesz przez to powiedziec??
  • 0

#5 Chinka

Chinka

    Seal of Approval

  • 426 postów

Napisano 27 12 2008 - 15:45

Jak to dokładnie wytłumaczyć:
- wprowadzamy strumieniowo zmienną(znaczy się przez cin)
- typy się nie zgadzają, wyskakuje błąd

Aby cin był dalej do użytku:
- należy wyczyścić stan błędu(robi to instrukcja cin.clear())
- a także bufor klawiatury(inaczej wprowadzałby cały czas zły typ danych, czyścimy go tą drugą instrukcją)

  • 0

Zobacz więcej tematów z tagiem: język C++



Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych