Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Бъг при използване на if
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=5814
Страница 1 от 1

Автор:  tiger [ Вто Май 27, 2008 11:21 pm ]
Заглавие:  Бъг при използване на if

Имам чувството, че имам елементарна грешка, но не мога да я видя. Затова ако може да погледнете кода. Когато променливата с стане равно на 1000 програмата зацикля на if-а, след който има коментар. Ако вместо if използвам while (като сменя само имената на двете функции и нищо друго) програмата работи

Код:
#include <avr\io.h>
#include <util\delay.h>

void main(void)
{
   char a = 65;
   unsigned int c = 0;

   DDRD = 0xff;

   while(1)
   {
      PORTD = 0x00;
      _delay_us((double)a);
      PORTD = 0xff;
      _delay_us((double)a);

      c++;
      if(c == 1000)//tuk zabiwa, ako vmesto if e while raboti bez problem
      {
         c = 0;
         if(a == 65)   {a = 75;   break;}
         if(a == 75)   {a = 87;   break;}
         if(a == 87)   a = 65;
      }
   }
}


Автор:  Nikola Kirov [ Вто Май 27, 2008 11:41 pm ]
Заглавие: 

с break излизаш от цикъла и излизаш после от main

Автор:  Gogo [ Вто Май 27, 2008 11:54 pm ]
Заглавие: 

Както е казал Никола, на тоя break не му е там местото. Пробвай така:
Код:
      {
         if(a == 65)   {a = 75;  goto next;}
         if(a == 75)   {a = 87;  goto next;}
         if(a == 87)   a = 65;
next:
         c = 0;
      }

Автор:  Nikola Kirov [ Сря Май 28, 2008 12:36 am ]
Заглавие: 

Gogo не е прието да се ползва goto при ситуации когато е лесно да се избегне

c = 0;
if(a == 65) a = 75;
else if(a == 75) a = 87;
else if(a == 87) a = 65;

Автор:  шопов [ Сря Май 28, 2008 12:44 am ]
Заглавие:  Re: Бъг при използване на if

доколкото разбирам, целта на програмата е да включва и изключва периодично някакви пинове на процесора, и от време на време да сменя периода; наистина, при тази програма, с тези break-ове се излиза от най-близкия цикъл, т.е. от ф-ята main(), едва ли това се желае; обаче, ако правилно разбирам целта на програмата, решението с while също ще работи... това, което gogo е написал, ще работи; а защо работи програмата ако се замени if с while - защото в този случай break ще излезе веднага от цикъла след обновяване на 'a', т.е. цикълът ще се изпълни само веднъж, по-ясно - става точно това, което gogo е написал
по-добър вариант на кода може би е:
Код:
   if(c == 1000)
   {
      c = 0;
      switch (a)
      {
         case 65: a = 75; break;
         case 75: a = 87; break;
         default: /* just in case... */
         case 87: a = 65;
      }
   }

или
Код:
      if(c == 1000)
      {
         c = 0;
         if(a == 65)   
      a = 75;
    else if(a == 75)   
      a = 87;   break;}
         else /* if(a == 87) */
      a = 65;
      }

написах тези неща, защото навремето и аз често се бърках с break в езика c, и като пример, привеждам следната програма, която показва, че понякога синтаксисът на езика допуска доста своеволия:
Код:
#include <stdio.h>

int main(void)
{
         switch (sizeof main)
         {
                if (1)
                        printf("1");
                if (0)
                {
                        default:
                                printf("%c\012", (((int)main) & 1)["34"]);
                }
        }
        return main;
}

в крайна-сметка, най-вероятно (заради подравняванията), програмата ще напечата "3" - при мен толкова печата, но на друга архитектура може да напечата и "4"; не би трябвало никога обаче да се напечата "1"

Автор:  tiger [ Сря Май 28, 2008 9:21 am ]
Заглавие: 

Сега се чувствам доста тъпо, защото съм използвал break за излизане от if :oops: :oops: :oops: А той се използва само за излизане от цикли.

Благодаря за отговорите и примерните програмки

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/