Goto kullanmadan ve kod boyunu artirmadan kodu duzenlemek

Başlatan z, 20 Mart 2021, 10:54:45

z

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:               .....; 
                }
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

karbal656


muhittin_kaplan

Çok uzun ise farklı fonksiyonlara zaten bölmelisiniz hocam.

z

.... 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.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Alıntı YapOte yandan fonksiyon cagirirken olusan ilave gecikmeyi de istemiyorum.
Bunu anlamadım, neden geçiksin ki ?

mylord92

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.

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Yuunus


Tagli

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.
Gökçe Tağlıoğlu

Yuunus

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.

ex_machina

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.

z

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; 
            } 
        }
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

quarko

Şö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; 
	} 
}
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

Tagli

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.
Gökçe Tağlıoğlu

muhittin_kaplan