[C] Problem z goto

0

Witam, mam taki kod:

 
menu1:
  printf("Aby wyscietlic kategorie wybierz: 1\n");
  printf("Aby opuscic program wybierz: 2\n");
  
  scanf("%d", &funkcja1);
  
  if(funkcja1 == 1) {
  /* cos tam itp.. */
  }
  
  else if(funkcja1 == 2) {   
    exit(0);   
  }
  
  else {    
    fprintf(stderr, "Nieprawidlowa funkcja. Prosze wybrac ponownie.\n");
    goto menu1;    
  }

Chce aby, po wybraniu zlej opcji kierowało do początku i tak się dzieję, ale scanf nie pobiera już ponownie wartości, a zatem skoki idą w nieskończoność. Gdy używam fgetc są 2 skoki i dopiero pobiera wartość ponowną. Chcę, aby był jeden skok do początku i pobiera wartość. Co jest nie tak?

0

Głównym problemem jest tutaj to że używasz goto...

A twój kod wygląda na poprawny i u mnie działa.

0

wczytuj liczbę tak:

        char linia[100];
        int d;
        fgets(linia,sizeof(linia),stdin);
        sscanf(linia,"%d",&d);

poza tym za te goto w tak nieuzasadnionym miejscu Twój nauczyciel powinien zdzielic Ci w mocno w łeb.

0

nieuzasadnionym miejscu

A które byłoby uzasadnione ?

0
for(...)
   for(...)
      for(...)
        {
         if (...)
            goto chcestadwyjsc;
         //...
        }
chcestadwyjsc:
//...
0
for(...)
   for(...)
      for(...)
        {
         if (...)
            break;
         //...
        }
0
krwq napisał(a)

poza tym za te goto w tak nieuzasadnionym miejscu

Nie ma sytuacji, w której użycie goto byłoby uzasadnione. Jeśli ktoś myśli inaczej to znaczy, że ma złą implementację.

0

patryk27. ten break wychodzi tylko z pierwszego fora. mozna zrobic flage ktora sprawdza w kazdej podpetli czy juz petla sie zakonczyla i zrobic na koncu breaka, tylko po co.

0
krwq napisał(a)

patryk27. ten break wychodzi tylko z pierwszego fora. mozna zrobic flage ktora sprawdza w kazdej podpetli czy juz petla sie zakonczyla i zrobic na koncu breaka, tylko po co.

Jak to po co? Bo chcesz wyjść z tych pętli.
Poważniej, to troszkę więcej kodu jednak bardziej czytelniejszego i łatwiejszego w wykrywaniu ewentualnych krachów. Jak skaczesz sobie z bloku do bloku to robi ci się syf i po jakimś czasie wrócenie do takiego źródła staje się udręką bo musisz wertować cały kod. Poza tym upierasz się przy swoim, a prawda jest taka, że nie podasz sytuacji, w której goto nie dałoby się zastąpić czymś innym. Rób jak chcesz jednak nie masz racji co do goto, a ten temat jest na 4p poruszany kilkakrotnie w ciągu miesiąca i nie spotkałem się jeszcze z opinią, żeby goto było komuś niezbędne.

0

czytelniejsze?

for(...)
   for(...)
      for(...)
        {
         if (...)
            goto chcestadwyjsc;
         //...
        }
chcestadwyjsc:
//...
bool chcewyjsc = false;
for(...)
  {
     for(...)
      {
        for(...)
          {
           if (...)
             {
              chcewyjsc = true;
              break;
             }
           //...
          }
       if (chcewyjsc)
         break;
      }
   if (chcewyjsc)
     break;
  }
//...

ze niby to jest czytelniejsze i predzej sie w tym nie pomylisz?
jeśli dodasz komentarz przy każdym upraszczającym goto to życie stanie się łatwiejsze i przy pisaniu i przy debugowaniu, pomijając już kilka(set) tysięcy zbędnych instrukcji przy nie używaniu goto

0

a co za problem umieścić warunek w pętli?

 for(int i = 0; i < 100, chce_wyjsc != true; ++i)

Jeśli dla ciebie goto jest tak przydatne i uważasz, że jest lepsze to jest twoje zdanie tylko nie wpajaj tego mniej doświadczonym bo jeszcze ci uwierzą i w tedy będzie się roić na forach od tego typu konstrukcji, które do niczego dobrego nie prowadzą.

0

albo wrzuć pętle do funkcji i wykonaj return. Możesz jeszcze zrobić dziesiątki innym czynności, lepszych czy gorszych jednak zawsze lepszych od goto.

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