Jak się pozbyć goto?

Jak się pozbyć goto?
M8
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:4
0

Wiem, że nie ma czegoś takiego jak goto w javie, ale nie potrafię sobie poradzić pętlami, mimo iż próbowałem. Jestem początkujący. Będę wdzięczny jeśli ktoś mi pokaże co z tym można zrobić.

Urywek kodu:

Kopiuj
 _L8:
        int l = Pierwszy(j);
        if(!CzyJestPusta(j)) goto _L2; 
        else goto _L1
_L1:
        if(l != -1) goto _L4; else goto _L3
_L4:
        j = l;
_L2:
        int k;
        if(i != 3)
            k = 0;
        else
            k = PoszukajNajkrotszego(j);
          goto _L5
_L9:
        if(tablica[k].wykonany || j < tablica[k].czas_nadejscia)
            break; /* Loop/switch isn't completed */
        if(tablica[k].czas_zaczecia == -1)
            tablica[k].czas_zaczecia = j - tablica[k].czas_nadejscia;
        if(i == 1 || i == 2 || i == 4)
        {
            Pokaz(j, k, tablica[k].czas_trwania);
            j += tablica[k].czas_trwania;
            tablica[k].czas_do_ukonczenia = 0;
        }
        if(i == 3 || i == 5)
        {
            int i1 = Pierwszy(j);
            if(i1 == -1 || i1 - j >= tablica[k].czas_do_ukonczenia)
            {
                Pokaz(j, k, tablica[k].czas_do_ukonczenia);
                j += tablica[k].czas_do_ukonczenia;
                tablica[k].czas_do_ukonczenia = 0;
            } else
            {
                i1 -= j;
                Pokaz(j, k, i1);
                j += i1;
                tablica[k].czas_do_ukonczenia -= i1;
            }
        }
        if(i == 6)
            if(tablica[k].czas_do_ukonczenia <= dl_kwantu)
            {
                Pokaz(j, k, tablica[k].czas_do_ukonczenia);
                j += tablica[k].czas_do_ukonczenia;
                tablica[k].czas_do_ukonczenia = 0;
            } else
            {
                Pokaz(j, k, dl_kwantu);
                j += dl_kwantu;
                tablica[k].czas_do_ukonczenia -= dl_kwantu;
            }
        if(tablica[k].czas_do_ukonczenia == 0)
        {
            tablica[k].wykonany = true;
            tablica[k].czas_zakonczenia = j - tablica[k].czas_nadejscia - tablica[k].czas_zaczecia;
        }
        if(i == 6) goto _L7; else goto _L6;
_L7:
        continue; /* Loop/switch isn't completed */
_L6:
        break; /* Loop/switch isn't completed */
        k++;
_L5:
        if(k < ile) goto _L9; else goto _L8;
_L3:
        if(rysuj)
            PokazLegende();
        return j;
Olamagato
Zawsze mnie zastanawiało po co ludzie marnują czas na rozgryzanie cudzego kodu, kiedy mogą poświęcić go na zrobienie własnego, być może lepszego rozwiązania.
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 2 godziny
0

Te break i continue to do czego się odnoszą?


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
M8
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:4
0

Starałem się to jakoś pętlami zastąpić, to pozostałości. Teraz tego ogarnąć nie mogę, a inaczej nie potrafię przedstawić rozwiązania problemu.

1
marian85 napisał(a)

inaczej nie potrafię przedstawić rozwiązania problemu.

Przede wszystkim JAD nie potrafi. Możesz ładnie poprosić autora o udostępnienie kodu lub użyć sprawniejszego dekompilatora.

Olamagato
To kolejny dobry przykład dlaczego warto używać switcha z eliminowaniem break w pętlach. :)
M8
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:4
0

Jak nie da rady tego jakoś przedstawić pętlami to trudno.

Shalom
Każdy kod da się przedstawić bez użycia goto.
Wibowit
Każdy kod da się przepisać w Brainfucku.
Demonical Monk
Każdy algorytm*, ze standardowym setem instrukcji byś niewiele zdziałał ;]
Wibowit
Gdybym zmapował porty komputera na część pamięci dostępnej z Brainfucka (i tak się takie coś zwykle robi - IOMMU) to bym mógł zrobić praktycznie wszystko.
M4
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
1

Bierzesz kartkę i jedziesz, to tak ciężko? Rozrysowujesz sobie jak działa, pętle rzucają się od razu w oczy :)

M8
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:4
0

Przypatrz się i zauważysz, że to nie takie proste.

0
marian85 napisał(a)

to nie takie proste.

To jest bardzo proste, wystarczy wciągnąć thunki, to zwykłe podstawienie. Jedyne, co nie jest oczywiste:

Kopiuj
        break; /* Loop/switch isn't completed */
        k++;

Ten kod może oznaczać, że JAD coś pomylił, ew. autor kodu się nie popisał.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.