Wątek przeniesiony 2015-05-09 15:04 z C/C++ przez Ktos.

For loop - Unreachable code detected

0
namespace BeehiveManagementSystem
{
    class Queen
    {
        private Worker[] workers;
        private int ShiftNumber = 0;

        public Queen(Worker[] workers)
        {
            this.workers = workers;
        }
        
        public string WorkTheNExtShift
        {

        }

        public bool AssignWork(string JobNeedsToBeDone, int numberOfShifts)
        {
            for (int i = 0; i < workers.Length; i++)
            {
                if (workers[i].DoThisJob(JobNeedsToBeDone, numberOfShifts))
                {
                    return true;
                }

                //else {
                //    return false;
                //}
            
            }
            return false;
                
              

            }

        }

    }
 

Cześć wszystkim :) Niedawno zacząłem się uczyć programowania w C# i używam do tego celu książki head First. Podany został tam przykład programu do zarządzania ulem (zapewne Ci którzy czytali wiedzą o co chodzi). Mam problem ze zrozumieniem Warningu dla "For Loop" dla metody AssignWork. Mianowicie jeśli usunę komentarze z funkcji "else { return false; }" dostane ostrzeżenie o Unreachable Code Detected. Nie bardzo rozumiem dlaczego nie mogę zwrócić do metody false za każdym razem jak nie spełnie warunku z "if". Nie rozumiem dlaczego po przejściu całej pętli FOR zwracam do metody false. Co się stało z wartościami "true" z pętli For->If? Dzięki za wytłumaczenie i pomoc :)

0

Pokaż kod metody DoThisJob. Nie zwraca czasami zawsze true?

0
namespace BeehiveManagementSystem
{
    class Worker
    {
        private string currentJob = "";
        public string CurrentJob { get { return currentJob; } private set; }
        public int ShiftsLeft
        {
            get
            {
                return shiftsToWork - shiftsWorked;
            }
            private set;
        }

        private string[] jobsICanDo;
        private int shiftsToWork;
        private int shiftsWorked;

        public Worker(string[] jobsICanDo)
        {
            this.jobsICanDo = jobsICanDo;
        }

        public bool DoThisJob(string job, int numberOfShifts)
        {

            if (!String.IsNullOrEmpty(CurrentJob))
                return false;
            for (int i = 0; i < jobsICanDo.Length; i++)
                if (jobsICanDo[i] == job)
                {
                    this.CurrentJob = job;
                    this.shiftsToWork = numberOfShifts;
                    this.shiftsWorked = 0;
                    return true;
                }
            return false;
        }



        public bool WorkOneShift ()
        {
            if (String.IsNullOrEmpty(CurrentJob))
            return false;
            
            shiftsWorked++;

            if (shiftsWorked > shiftsToWork)
            {
                shiftsToWork = 0;
                shiftsToWork = 0;
                currentJob = null;
                return true;
            }
            else
            {
                return false;
            }
           


        }
    }
}
 

Szybkie objaśnienie. DoThisJob najpierw sprawdza czy jakaś pszczółka pracuje dzięki String.IsNullOrEmpty(). Jeśli String.IsNullOrEmpty() jest prawdziwe to znaczy że pszczoła nie ma pracy. Następnie metoda sprawdza czy pszczoła która nie ma pracy ma odpowiednie umiejętności (ma ich dwie) i jest w stanie wykonać prace (jest 6 typów pracy). Jeśli tak to przypisujemy prace do pszczoły ustawiamy czas pracy (shifts) i zwracamy true.

0

Jeżeli odkomentujesz tego else'a, to sprawdzisz tylko pierwszy element workers. Czy na pewno chciałeś, aby tak to działało?

0

Bardzo bym Cię prosił abyś mi zobrazował co się dzieję z "elsem" oraz bez "elsa" :) Bo widzisz w tym problem ja wiem co chce aby się stało, ale chyba zgubiłem się w procesie wchodzenia, wychodzenia z pętli. Kiedy pętla startuje, kiedy kończy.
Nie rozumiem też dlaczego po całej pętli zwracam false dla całej metody. To co się stało z tamtymi "true" z pętli if? One istnieją? Zostały przyjęte? Wyobrażam sobie to tak, że wykonuje się pierwsza pętla "for" (mowimy o metodzie AssignWork). Załóżmy że zwraca true. To true leci dalej do innych polecen które używaja AssignWork, wykonywane są tam odpowiednie obliczenia i wtedy program wraca do pętli "for" w AssginWork i wykonuje druga pętle. Dobrze to rozumiem?

1
public bool method(string args) {
    for (myValue in setOfValues) {
        if (conditionalStatement(myValue)) {
            return true;
        } else {
            return false;
        }
    }
    return false;
}

Ok, teraz prześledźmy, jak to działa.

  1. Wywołujemy metodę
  2. Metoda zaczyna wykonywać pętlę for ("dla każdej wartości myValue w zbiorze wartości setOfValues")
  3. Do zmiennej myValue zostaje przypisana pierwsza wartość ze zbioru setOfValues
  4. Sprawdzana jest wartość conditionalStatement(myValue), gdzie myValue jest ukonkretniona do elementu zbioru setOfValues
  5. Jeżeli conditionalStatement(myValue) jest spełnione (zwraca "true"), to cała metoda kończy swoje działanie zwracając "true"
  6. W przeciwnym przypadku, gdy conditionalStatement(myValue) nie jest spełnione (zwraca "false"), cała metoda kończy działanie i zwraca "false"

Wniosek:
Testowana jest tylko jedna (pierwsza) wartość ze zbioru wartości setOfValues

0

O kurcze! No tak. Return kończy całkowicie metodę. Ok! Teraz ma to sens. Dziękuje!

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