Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => C/C++ => Konuyu başlatan: z - 20 Mart 2021, 10:54:45

Başlık: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: z - 20 Mart 2021, 10:54:45
Asagidaki kodu uzatmadan Gotolardan kurtarabilirmisiniz?
.... olan yerlerde cok uzun kod parcalari var ve bunlari fonksiyon olarak cagirmiyorum.


void Dongu(int Basi)
{
       if (Basi==2) goto B2;
       if (Basi==3) goto B3;
       while(1) {
B1                .....;
B2:               .....;
B3:               .....;
                }
}
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: karbal656 - 20 Mart 2021, 11:25:32
Belki switch case kullanılabilir.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: muhittin_kaplan - 20 Mart 2021, 11:44:49
Çok uzun ise farklı fonksiyonlara zaten bölmelisiniz hocam.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: z - 20 Mart 2021, 11:57:57
.... larin her birisinde birbirinden farkli kodlar iceren rutinler ve sadece burada kullaniliyor.

Ote yandan fonksiyon cagirirken olusan ilave gecikmeyi de istemiyorum.

Yillar once asm olarak kodladigim bir programi Cye ceviriyorum.

Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: muhittin_kaplan - 20 Mart 2021, 12:00:10
Alıntı YapOte yandan fonksiyon cagirirken olusan ilave gecikmeyi de istemiyorum.
Bunu anlamadım, neden geçiksin ki ?
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: mylord92 - 20 Mart 2021, 12:05:08
Switch case kullanabilirsiniz. Goto ile hemen hemen benzer yaptığı şey.

Fonksiyon çağırmak istemiyorsanız, yinede bir fonksiyon yazıp bunu inline yapabilirsiniz. Bu sizi fonksiyon gecikmesinden kurtarır.

Görüntü olarak daha derli toplu durur ve okunaklı bir kod haline gelir.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: z - 20 Mart 2021, 12:42:32
Call ve ret gibi komutlar pipeline icerigini yeniden doldurmayi gerektiriyor.

Bir dongu icinde fonksiyonlari cagirip durursan islemci cok fazla hiz kaybediyor.
O yuzden for, while benzeri komutun dongu sayisi az ise kodu tekrarli yazma yoluna bile gidilebiliyor.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: Yuunus - 20 Mart 2021, 12:55:08
optimizasyon o isi baya hizladirabilir.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: Tagli - 20 Mart 2021, 14:23:37
Modern derleyiciler bu tür kodları içeren fonksiyonları inline yaparak optmize edebilir. Yine de programcının fonksiyonu inline olarak tanımlaması daha doğru  olur.

Fonksiyon tanımı ve kullanımı aynı .c dosyası içinde ise, fonksiyon inline tanımlanmasa bile derleyici bu optimizasyonu yapabilir. Yine de belki fonksiyon uzun olduğu için elle yazmak gerekiyor olabilir.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: Yuunus - 20 Mart 2021, 14:44:53
gene kavga cikacak, ben onun optimizesinden daha iyi kod yazarim diyecek. ;D  @z hocam en optimize koduda yazsan c kullandiktan sonra , icine asm de gomsen, ide allem edip kallem edip senin koddan daha hizli calistiriyor optimize ettigi kodu, daha dun denedim ulan daha nasil yazilirki dedigim pin high-low kodunu benden daha hizli calistirdi atollicte.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: ex_machina - 20 Mart 2021, 15:38:15
Hocam fonksiyon çağırma sırasında zaman kaybettiren stacking-unstacking işlemlerinden kurtulmak istiyorsanız @Tagli'nin dediği gibi "inline" preprocessor ifadesini fonksiyon tanımlarken kullanabilirsiniz.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: z - 20 Mart 2021, 16:12:50
Konu kaydi. Zaten kalabalik kod toplulugunu fonksiyon yazmadigim icin ortada bahsettigimiz sorun yok.

Asagidaki de sirf gotodan kacmak adina sacma olacagindan Kodu goto kullanarak yazdim.

void Dongu(int Basi)
{
      if (Basi==1)
        {
          while(1)
            {
              B1 satirindaki kodlar;
              B2 satirindaki kodlar;
              B3 satirindaki kodlar;
            }
        }

      if (Basi==2)
        {
          while(1)
            {
              B2 satirindaki kodlar;
              B3 satirindaki kodlar;
              B1 satirindaki kodlar;
            }
        }

      if (Basi==3)
        {
          while(1)
            {
              B3 satirindaki kodlar;
              B1 satirindaki kodlar;
              B2 satirindaki kodlar;
            }
        }
}

Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: quarko - 20 Mart 2021, 16:49:35
Şöyle de olabilir galiba hocam. if lerden de kurtulmuş olursun.

void Dongu(int Basi)
{
while((1) && (Basi==1))
{
B1 satirindaki kodlar;
B2 satirindaki kodlar;
B3 satirindaki kodlar;
}

while((1) && (Basi==2))
{
B2 satirindaki kodlar;
B3 satirindaki kodlar;
B1 satirindaki kodlar;
}

while((1) && (Basi==3))
{
B3 satirindaki kodlar;
B1 satirindaki kodlar;
B2 satirindaki kodlar;
}
}
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: Tagli - 20 Mart 2021, 17:39:06
Pardon, while bloğu benim gözümden kaçmış. Bu durumda en temiz yöntem @karbal656 'nın önerdiği switch-case bloğu gibi gözüküyor.

Alıntı yapılan: ex_machina - 20 Mart 2021, 15:38:15"inline" preprocessor ifadesini
Burada ufak bir düzeltme gerekiyor: inline bir preprocessor ifadesi değildir, C dilinin doğrudan bir parçasıdır.

@quarko 'nun (ve bir önceki mesajda @z 'nin) önerdiği yöntem performans açısından uygun ancak başka sorunlar içeriyor. Birincisi, kod hafızada fazladan yer kaplayacak. İkincisi, aynı kodun birden fazla yerde tekrarlanması bakım maliyetini arttıracak. İleride kodu değiştirmek gerektiğinde bir yerdekini değiştirip diğerini unutma tehlikesi var. Ayrıca if bloğu içinde (1) && ile başlayan bir ifadenin bir etkisi yok, boş yere yazılmış. Derleyici muhtemelen optimize edip kaldırır bunu. Bu şekilde yazılmış bir kod bence goto kullanımından daha kötü ve tehlikeli.

Ancak bence @z pek de var olmayan bir sorun üzerinde kafa patlatıyor olabilir. B1, B2, B3 çok uzun kod parçaları ise, döngüde fonksiyon çağırmanın maliyeti bu satırların yanında zaten düşük kalacaktır. Şahsi görüşüm, kolay anlaşılır ve bakım yapılabilir bir kodun çoğu zaman yüksek performanstan daha önemli olduğu yönündedir. Eğer zamanlama ile ilgili çok kritik bir durum yoksa, kodu optimize etmek için kodun temizliğinden ödün verilmemelidir.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: muhittin_kaplan - 20 Mart 2021, 17:53:32
Clean Code nedir ?
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: Yuunus - 20 Mart 2021, 18:03:46
@z hocam debug asamasinda zaten ne yaptigini goruyorsun hiz cok kritik ise ordan irdeleyebilirsin, bencede fonksiyon seklinde yazmak en kulfetsiz ve anlasiliri @Tagli nin dedigi gibi ide ne kullaniyorsunuz bilmiyorum ama eclipse atollic, beles, icinde 5 ayri optimizasyon secenegi var, zaten gereksiz bircok yeri en hizli calisacak sekle donusturuyor, illede benim dedigim gibi calisacak duyorsan sozum yok, yinede gozardi etme optimizasyonu belki bir tanesi asm deki gibi "bl func" seklinde dallaniyordur denemek lazim.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: foseydon - 20 Mart 2021, 21:25:37
switch...case ile yapılabilir. switch... look up table kullandığı için baya hızlı olur, goto performansı alırsınız. veya her durumda yazılacak fonksiyonu tutan function pointer array den çağırabilirsiniz. o da aynı hız olur tahminin yazıp denemek lazım.
Başlık: Ynt: Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek
Gönderen: fatal16 - 20 Mart 2021, 22:24:37
Hocam bi deneyebilir misiniz?
void Dongu(int Basi){

while(1){
switch(Basi)
        {
            case 1:
                B1;
            case 2:
                B2;
            case 3:
                B3;
        }
        Basi=1;
}
}