Jak się pozbyć goto?

Odpowiedz Nowy wątek
2011-10-07 01:27
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:

 _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;
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. - Olamagato 2011-10-07 08:45

Pozostało 580 znaków

2011-10-07 01:46
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.

Pozostało 580 znaków

2011-10-07 02:21
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.

Pozostało 580 znaków

2011-10-07 03:26
pozwany
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.

To kolejny dobry przykład dlaczego warto używać switcha z eliminowaniem break w pętlach. :) - Olamagato 2011-10-07 12:13

Pozostało 580 znaków

2011-10-07 13:17
0

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

Każdy kod da się przedstawić bez użycia goto. - Shalom 2011-10-07 13:39
Każdy kod da się przepisać w Brainfucku. - Wibowit 2011-10-07 13:52
Każdy algorytm*, ze standardowym setem instrukcji byś niewiele zdziałał ;] - Demonical Monk 2011-10-07 16:12
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. - Wibowit 2011-10-07 17:21

Pozostało 580 znaków

2011-10-07 13:44
1

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

Pozostało 580 znaków

2011-10-07 14:24
0

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

Pozostało 580 znaków

2011-10-07 16:50
pozwany
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:

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

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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