Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

ccs c goto sorunu

Başlatan r_d_, 10 Temmuz 2014, 15:45:49

r_d_

Arkadaşlar merhaba, c konusunda biraz tecrübesizim ve bir konuda takıldım. Başım goto komutu ile dertte, kullanmam gerekiyor ama bu sefer de sorun çıkarıyor. Goto yerine ne kullanabilirim onu bilmiyorum. Yapmak istediğim şeyi kısaca açıklayayım: Senkron çalışan led moduller tasarlamaya çalışıyorum ve şu anda modül 2 flash moduna sahip.  Void bekle() fonksiyonunda pin_b4 den sinyal geldiğinde tekrar mainin içerinde bulunan case 1(1. mod) a dallanması gerekiyor. Goto kullandığım zaman undefined label that was used in a goto> aaa ve bbb diyor  tanımıyor doğal olarak. Void bekle() fonksiyonunda pin_b4 den sinyal geldiği zaman nasıl  aaa: veya bbb: noktasına dallandırabilirim?
int b=0;
int a=0;
int mode=0;
void bekle();

void moded(){
mode++;
while(input(pin_b1));
}

void main()
{
      setup_adc_ports(NO_ANALOGS);
      setup_adc(ADC_OFF);
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
      setup_comparator(NC_NC);
      set_tris_b(0b00110010);
      
   while(1)
   {  output_b(0x00);            //önemli
         
      if(input(pin_b1))
      {
         moded();
      }      
      
      switch (mode) 
      {      
         case 0:                           //mode=0
         {                     
            if(input(pin_b4))                //SLAVE
            {             
               if (input(pin_b1))
               {
                  moded();
               }
               else 
               {
                  aaa:
                  output_high(pin_b0);
                  delay_ms(25);
                  b=19;
                  bekle();
                  output_low(pin_b0);
                  b=20;
                  bekle();
               }
            }
            else                             //MASTER
            {                     
               output_high(pin_b0);
               output_high(pin_b2);
               delay_ms(25);
               output_low(pin_b2); 
               b=19;
               bekle();
               output_low(pin_b0);
               b=20;
               bekle();
            }
         break;
         } 
         case 1:                          //mode=1
         {                  
            if(input(pin_b4))              //slave
            {              
               if (input(pin_b1))
               {
                  moded();
               }
               else
               {
                  bbb:
                  output_high(pin_b0);
                  delay_ms(25);
                  b=9;
                  bekle();
                  output_low(pin_b0);
                  b=10;
                  bekle();
                  output_high(pin_b0);
                  b=10;
                  bekle();
                  output_low(pin_b0);
                  b=10;
                  bekle();
               }
            }
            else
            {                      //master
               output_high(pin_b0);
               output_high(pin_b2);
               delay_ms(25);
               output_low(pin_b2);
               b=9;
               bekle();
               output_low(pin_b0);
               b=10;
               bekle();
               output_high(pin_b0);
               b=10;
               bekle();
               output_low(pin_b0);  
               b=10;
               bekle();
            }
         break;
         }
         case 2:                         //mode=2
         {
            mode=0;
         break;
         }
      }
   }
}
   
void bekle()
{
   for (a=0;a<b;a++)
   {
      if(input(pin_b4))
      {
              if(mode==0)
              { goto aaa;
              }
            else if(mode==1)
              {
               goto bbb;
              }
         
         
      }
      else
      {
      delay_ms(25);
      }
   }
}

sadogan

Bir fonksiyon içinden başka bir fonksiyondaki etikete dallanmaya çalışıyorsun.
Sorunun burda. 

aaa ve bbb etiketteki işleri alt fonksiyon şekkinde yazıp
goto ile gitmeye çalıştığın yerde bu fonksiyonları çağırabilirsin.

LukeSkywalker

goto komutu sık kullanılmaz ve sık kullanılması da tavsiye edilmez C derleyicilerinde.
Yukarıda da belirtildiği gibi, fonksiyon kullanımını öğrenmeniz sizin açınızdan çok daha iyi olacaktır.

Gökhan BEKEN

goto kullanmak genellikle assembly den kalma alışkanlıktır. Spagetti diye tabir ettiğimiz kodla şekline girer. İyi bir programcı, aynı kodu sürekli yazmaz, bir kere fonksiyon yazar, diğer programlarında da onu kullanır. Hatta bir kütüphane yazar, ve bu kütüphaneyi ansi c nin verdiği yetkiye dayanarak, önişlemci direktiflerinin de yardımıyla platform bağımsız kullanır. Aynı kütüphaneyi hem PIC'te hem ATMEL'de, hem ARM tabanlı MCU'larda kullanmaktan bahsediyorum. İşte bunlar spagettiyi bırakıp, fonksiyonel kod, hatta c++ ile nesneye dayalı kod yazmaktan geçiyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

r_d_

Öncelikle teşekkür ediyorum yorumlarınız için. Fonksiyonel kod yazmak birinci önceliğim fakat yapacağım işi söylediğiniz mantıkla yapamadığım için goto kullanmak zorunda kalıyorum. @sadogan arkadaşın yorumuna dayanarak o yönde ilerlemeye çalışacağım artık.

r_d_

#5
Kodu dediğiniz gibi değiştirmeye çalıştım fakat şimdi de recursion not permitted [aaa] diyor
int b=0;
int a=0;
int mode=0;
void bekle();

void moded(){
mode++;
while(input(pin_b1));
}

void aaa()
{  
   b=19;
   bekle();
   output_low(pin_b0);
   b=20;
   bekle();  
}
   
void bbb()
{
   b=9;
   bekle();
   output_low(pin_b0);
   b=10;
   bekle();
   output_high(pin_b0);
   b=10;
   bekle();
   output_low(pin_b0);
   b=10;
   bekle();
}

void bekle()
{
   for (a=0;a<b;a++)
   {
      if(input(pin_b4))
      {
         if(input(pin_b1))
         {  
            moded();
         }
         else
         {
            if(mode==0)
              { 
                  aaa();
              }
            else if(mode==1)
              {
                  bbb();
              }
         }
         
      }
      else
      {
         delay_ms(25);
      }
   }
}

void main()
{
      setup_adc_ports(NO_ANALOGS);
      setup_adc(ADC_OFF);
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
      setup_comparator(NC_NC);
      set_tris_b(0b00110010);
      
   while(1)
   {  output_b(0x00);            //önemli
         
      if(input(pin_b1))
      {
         moded();
      }   
 switch (mode) 
      {      
         case 0:                           //mode=0
         {                     
            if(input(pin_b4))                //SLAVE
            {             
               if (input(pin_b1))
               {
                  moded();
               }
               else 
               {
                  output_high(pin_b0);
                  delay_ms(25);
                  aaa();
                  
               }
            }
            else                             //MASTER
            {  
               output_high(pin_b2);
               output_high(pin_b0);
               output_low(pin_b2); 
               aaa();
            }
         break;
         } 
         case 1:                          //mode=1
         {                  
            if(input(pin_b4))              //slave
            {              
               if (input(pin_b1))
               {
                  moded();
               }
               else
               {                  
                  output_high(pin_b0);
                  delay_ms(25);
                  bbb();
               }
            }
            else
            {                      //master
               output_high(pin_b0);
               output_high(pin_b2);
               delay_ms(25);
               output_low(pin_b2);
               bbb ();
            }
         break;
         }
         case 2:                         //mode=2
         {
            mode=0;
         break;
         }
      }
   }
}

Gökhan BEKEN

aaa nın içinde bekleyi çağırıyorsun, beklenin içinde tekrar aaa yı çalıştırıyorsun, sonsuza kadar çıkamaz.
Özel mesaj okumuyorum, lütfen göndermeyin.

r_d_

Haklısınız hocam hallettim o kısmı teşekkür ederim.