Отговори на тема  [ 6 мнения ] 
Бъг при използване на if 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Мар 04, 2007 10:21 pm
Мнения: 70
Мнение Бъг при използване на 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;
      }
   }
}



Вто Май 27, 2008 11:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
с break излизаш от цикъла и излизаш после от main


Вто Май 27, 2008 11:41 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Както е казал Никола, на тоя break не му е там местото. Пробвай така:
Код:
      {
         if(a == 65)   {a = 75;  goto next;}
         if(a == 75)   {a = 87;  goto next;}
         if(a == 87)   a = 65;
next:
         c = 0;
      }


Вто Май 27, 2008 11:54 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Gogo не е прието да се ползва goto при ситуации когато е лесно да се избегне

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


Сря Май 28, 2008 12:36 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Май 17, 2006 4:22 pm
Мнения: 34
Местоположение: софия
Мнение 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"


Сря Май 28, 2008 12:44 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Мар 04, 2007 10:21 pm
Мнения: 70
Мнение 
Сега се чувствам доста тъпо, защото съм използвал break за излизане от if :oops: :oops: :oops: А той се използва само за излизане от цикли.

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


Сря Май 28, 2008 9:21 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни