ic ice if ve else kullanimi

Başlatan selvi, 10 Mart 2014, 15:54:44

selvi

  ic ice if donguleri ve bir tane else kullandim.eger if lerden herhangi biri gerceklesmemisse else komutunu isle demek istedim.asagidaki sekilde duzenlemesi dogrumu.

   if( rx_buf[0] == 0x01 )    
                 {
                 {
                     LED_RX=1;delay_xms(500);LED_RX=0;  
                 }

               if (Flag.us==1)
               {
                 if( rx_buf[0] == 0x02 )    
                 {
                   LED_RX=1;delay_xms(500);LED_RX=0;
                 }

                 if( rx_buf[0] == 0x03 )
                 {
                    LED_RX=1;delay_xms(500);LED_RX=0;
                 }

                 if( rx_buf[0] == 0x04 )
                 {
                   LED_RX=1;delay_xms(500);LED_RX=0;
                 }

                 if( rx_buf[0] == 0x05 )
                 {
                    LED_RX=1;delay_xms(500);LED_RX=0;
                 }

                 if( rx_buf[0] == 0x06)
                 {
                     LED_RX=1;delay_xms(500);LED_RX=0;  
                 }
               }
               }
              else
              {
                 rx_data();     // restart Rx when data is not correct.
              }
Yaşam anlamlandırıldıkça kutsaldır....

subram

if elseif komutunu araştırın.

switch case komutu işinizi daha da kolaylaştıracaktır.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

berat23

burada ne yapmaya çalıştığınızı anlamadım. ilk başta rx_buf[0] == 0x01  ise zaten if içindeki kodlar gereksiz. delay içinde ne oluyor, o arada değişen birşey mi var?

selvi

  daha anlasilir olsun diye asagidaki sekilde duzenledim.programin kendisi calisiyor.sanki bu if else duzenlemsinde bir hata var.switch case ifadesiyle bunu duzenlemek mumkun mu?
    programda su sekilde bir sorgulama olmasini istiyorum.6 farkli bilgiyi sorguluyor.her butona basildiginda o 6  bilgiden  biri geliyor.eger gelen bilgi bu 6 bilgi disinda ise else komutunu islesin.yapmak istedigim budur.asagidaki sekilde ki duzenlenis dogru mu?ya da daha pratik yapilabilir mi?

        if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x01 ))     
                 {
                    LED_RX=LED_RX^1;  
                    delay_xms(500);
                    LED_RX=LED_RX^1;Flag.us=1;
                 }

               if (Flag.us==1)
               {
                 if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x02 ))     
                 {
                    LED_RX=1;delay_xms(500);LED_RX=0;
                 }

                 if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x03 ))     
                 {
                     LED_RX=1;delay_xms(500);LED_RX=0;
                 }

                 if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x04 ))     
                 {
                   LED_RX=1;delay_xms(500);LED_RX=0;
                 }

                 if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x05))    
                 {
                    LED_RX=1;delay_xms(500);LED_RX=0;
                 }

                 if(( chksum == rx_buf[4] )&&( rx_buf[0] == 0x06 ))   
                 {
                    LED_RX=LED_RX^1;   
                    delay_xms(500);
                    LED_RX=LED_RX^1;Flag.us=0;
                 }
               }
               
              else
              {
                 rx_data();     // restart Rx when data is not correct.
              }
Yaşam anlamlandırıldıkça kutsaldır....

xoom

SWITCH-CASE YAPISI

switch(deger)
{
case a: işlemler
.....
break;
case b: işlemler
.....
break;
case c: işlemler
.....
break;
.
.
.
default: işlemler
...
break;
}

Örnek
int a,b,c;
int yas = 20;
 
switch(yas)    // yaş değişkeninin değerine bak
{
//yaş değeri 1 ise
case 1:  printf("daha bebek yaştasın");    // bu yazıyı yaz
break; // yapının sonuna git
case 20: printf("Askerlik çağına gelmişsin");  // yaş değeri 20
break; // yapının sonuna git
case 35: printf("Bu yaşa yolun yarısı deniliyor");
break; // yapının sonuna git
default:  printf("Yaşın 1,20,30 dan farklı");
break; // yapının sonuna git
}

berat23

olay switch case değil, bence başka hatalar da var. mesela flag = 1 dedikten sonra 1 olmuş mu diye konrol etmenin manası yok. o yüzden sordum o delay sırasında birşeyler oluyor mu diye, yoksa delay sadece ışık yakmak için mi diye? sonra flag = 1 den sonraki kodlar da dead code.

neyse, sizin kodu toparladım;

if( chksum == rx_buf[4] )
{
	if (( rx_buf[0] >= 1 ) && ( rx_buf[0] <= 6 )
	{
		LED_RX=1;
		delay_xms(500);
		LED_RX=0;
	}
}
else
{
	rx_data();     // restart Rx when data is not correct.
}

selvi

#6
Alıntı yapılan: berat23 - 11 Mart 2014, 15:19:53
olay switch case değil, bence başka hatalar da var. mesela flag = 1 dedikten sonra 1 olmuş mu diye konrol etmenin manası yok. o yüzden sordum o delay sırasında birşeyler oluyor mu diye, yoksa delay sadece ışık yakmak için mi diye? sonra flag = 1 den sonraki kodlar da dead code.

neyse, sizin kodu toparladım;

if( chksum == rx_buf[4] )
{
	if (( rx_buf[0] >= 1 ) && ( rx_buf[0] <= 6 )
	{
		LED_RX=1;
		delay_xms(500);
		LED_RX=0;
	}
}
else
{
	rx_data();     // restart Rx when data is not correct.
}


  rx_buf[0]=0x01  bilgisi geldiginde   "Flag.us=1;" bir kosul olarak yazdim.yani ilk kosul gerceklestikten sonra diger bilgileri kabul et demissim yani gelen ilk bilgi rx_buf[0]!=0x01 ise hic bir islem yapma demek istedim.daha sonra en son gelen bilgi rx_buf[0]=0x06 ise kosulu(Flag.us=0) sagla demisim.
    ayriyeten ilk bilgiler  rx_buf[0]={0x21,0x41,0x61...,0xc1} seklinde oldugunda program nasil  duzenlenebilir.
Yaşam anlamlandırıldıkça kutsaldır....

berat23

bence istediğinizi anlatamıyorsunuz. if bloğuna girdikten sonra flag 0 da olsa 1 de olsa farketmez, tekrar flag 1 mi diye kontrol etmek anlamsız. benim anladığım biryerden dizi geliyor, o dizideki elemanlara göre led yanıyor ve şimdide şifre gibi birşey yapmaya çalışıyorsunuz. rx_buf[0]={0x21,0x41,0x61...,0xc1} diye bir syntax yok c de. array'in 0. elemanına array atıyorsunuz, olmaz. array'deki elemanları kontrol etmek için basit bir if yeter;

if( ( rxBuffer[0] == 0x21) && (rxBuffer[1] == 0x41 )) 
{}


gibi

selvi

Alıntı yapılan: berat23 - 11 Mart 2014, 23:20:22
bence istediğinizi anlatamıyorsunuz. if bloğuna girdikten sonra flag 0 da olsa 1 de olsa farketmez, tekrar flag 1 mi diye kontrol etmek anlamsız. benim anladığım biryerden dizi geliyor, o dizideki elemanlara göre led yanıyor ve şimdide şifre gibi birşey yapmaya çalışıyorsunuz. rx_buf[0]={0x21,0x41,0x61...,0xc1} diye bir syntax yok c de. array'in 0. elemanına array atıyorsunuz, olmaz. array'deki elemanları kontrol etmek için basit bir if yeter;

if( ( rxBuffer[0] == 0x21) && (rxBuffer[1] == 0x41 )) 
{}


gibi

rx_buf[]={.....} 5 elemanli bir dizi.pratik olsun diye rx_buf[] ilk elemanlarini gostermeye calistim.tabi bir dizi gibi olmus.
verici uzerinde butonlar var.her butona basinca 5 eleman gonderiyor.
  ornegin;rx_buf[]={0x21,...},rx_buf[]={0x41,.....},rx_buf[]={0x61,...},...
Yaşam anlamlandırıldıkça kutsaldır....

mehmet

if(rx_buf[0])   // rx_buf[0] 0 dan büyük ise içeri girecek, kontroller switch içerisinde çözümlenecek. 
{
                 {					//burası ne iş yapıyor anlamadım
                     LED_RX=1;delay_xms(500);LED_RX=0;  //burası ne iş yapıyor anlamadım
                 }					//burası ne iş yapıyor anlamadım

             if (Flag.us==1)      // hatta burayı soyle yapabilirisin (üst satırlar olmadıgını dusunuyorum):
                                        //  if(rx_buf[0] && Flag.us){switch....}
                                        // tek if bloğu içinde çözümlenebilir bu şekilde.
                                        // rx_buf[x] e giren değerler belli ise
                                        // x değişkenini her switch sonunda artırıp ya da eksilterek
                                        // rx_buf[x] dizisindeki değerlere göre işlem yapabilirisiniz...
             {
                switch(rx_buf[0])
                {
                       case 0x02: //if( rx_buf[0] == 0x02 )    
                                LED_RX=1;         //bunlar eğer hep aynı satırlar ise bunları 
                                                         //tek fonksiyon haline getirip;
                                                         //       fonksiyon();
                                                         //       break;
                                                         //seklinde cağırabilirisiniz.
                                delay_xms(500);
                                LED_RX=0;
                                break;                 	

                       case 0x03: //if( rx_buf[0] == 0x03 )
                                LED_RX=1;
                                delay_xms(500);
                                LED_RX=0;
                                break;
                 
                       case 0x04: //if( rx_buf[0] == 0x04 )
                                LED_RX=1;
                                delay_xms(500);
                                LED_RX=0;
                                break;
                       case 0x05: //if( rx_buf[0] == 0x05 )
                                LED_RX=1;
                                delay_xms(500);
                                LED_RX=0;
                                break;
            
                       case 0x06: //if( rx_buf[0] == 0x06)
                                LED_RX=1;
                                delay_xms(500);
                                LED_RX=0;  
                                break;
                       default:
                                break;
                }
             }
}
else
{
    rx_data();     // restart Rx when data is not correct.
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr