C de neden "goto komutunu kullanmayın" diyorlar ? Ve yazılımcılık tavsiyeleriniz

Başlatan RaMu, 17 Mayıs 2013, 23:33:16

peko

Alıntı YapAma Ahmet ağa evinde kendine ya da müşterisine bir uygulama yazarken bırakın nasıl yazıyorsa yazsın.

Forumda C dilinde verilen kod örneklerini görüyoruz.

goto'ya gelinceye kadar ooooooo....

;)
" Bazıları zeka'sını iş'i zorlaştırmak için, bazıları ise kolaylaştırmak için kullanır.. "

z

C de icine girilen bir foksiyonun herhangi bir satirindan bir baska foksiyonun herhangi bir satirina goto ile ulasabilen varmi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bluekid

bildiğim kadarıyla goto aynı fonksiyon içinde çalışır

fonksiyonlar arası geçiş için
longjmp fonksiyonu var

mufitsozen

Alıntı yapılan: z - 20 Ekim 2015, 13:24:22
C de icine girilen bir foksiyonun herhangi bir satirindan bir baska foksiyonun herhangi bir satirina goto ile ulasabilen varmi?

ben (ve gerbay ve 100binden fazla expert c programcisi)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

bocek

şöyle oluyor galiba:
void *ptr;

void foo(void)
{
	zipla:
	ptr = &&zipla;
}

int main() {
	foo();
	goto *ptr;
	return 0;
}
1 ya da 0. işte 'bit'ün mesele..

mufitsozen

Alıntı yapılan: bocek - 20 Ekim 2015, 16:37:43
şöyle oluyor galiba:
void *ptr;

void foo(void)
{
	zipla:
	ptr = &&zipla;
}

int main() {
	foo();
	goto *ptr;
	return 0;
}


Hayir. Bu program stack'i dogru pozisyona almadigi icin buyuk ihtimalle gittigi fonksiyondan return ederken crash eder.

mesaj birleştirme:: 20 Ekim 2015, 16:52:53

Alıntı yapılan: bluekid - 20 Ekim 2015, 13:37:06
bildiğim kadarıyla goto aynı fonksiyon içinde çalışır

fonksiyonlar arası geçiş için
longjmp fonksiyonu var

sayin @bluekid bahsi gecen 100bin expert programcidan biri galiba  :)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

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

mufitsozen

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Bir örnek isterim o zaman.

Fonksiyonları ben vereceğim. Goto ile çıkış noktanızı ve zıplayacağınız yerleri de ben belirteceğim.

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

mufitsozen

Alıntı yapılan: z - 20 Ekim 2015, 17:51:58
Bir örnek isterim o zaman.

Fonksiyonları ben vereceğim. Goto ile çıkış noktanızı ve zıplayacağınız yerleri de ben belirteceğim.

Ok?

hocam su siralar birseyler ogretecek vaktim yok

setjump/longjmp nasil kullaniliyor bakiniz. Herhangi bir fonksiyondan program akisi sirasinda baska bir fonksiyona atlayabilirsiniz. Stack ve registerlarda korunacagi icin crash etmezsiniz. Bununla beraber heapten alinan bufferlardan dolayi (duzgun bir sistematik kurmazsaniz, ornegin referanslarini stack degiskenlerinde saklanan pointer'lar ) memory leak olabilir. Dikkatli olmak lazim. Tek sart setjmp cagirdiginiz noktaya program akisi sirasinda longjmp'tan once gelmeniz. Zaten bunun haricindaki durumlar anlamsiz olur., cunku bu tip program akisini yarida kesen ve normal akis yerine sizin istedigniz noktalara atlamanizi saglayan mekanizmalar sadece error/exception handling icin kullanilir.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Müfithocam haricinde bu işi yaparım diyen varmı?

Özellikle de C de goto kullanmayın zırvası yapanlardan.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

Alıntı yapılan: z - 20 Ekim 2015, 18:20:56
Müfithocam haricinde bu işi yaparım diyen varmı?

Özellikle de C de goto kullanmayın zırvası yapanlardan.

sayin @z hocam siz yinede istediginiz ornegi tanimlayin, bazen gece vakti uykum kaciyor, zihnimi toplayabilirsem istediginiz ornegide yaparim bakarsiniz, ama soz vermek istemiyorum cunku bazen dimagim cok yorgun oluyor.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Örneği veririm tabiki de;

Fonksiyon içinde kalmak şartı ile fonksiyon içinde değişik noktalara etiketler atayıp program akışı içinde belli şartlara göre ilgili etiketlere goto ile gitmek hiç bir risk içermiyor.
Buna karşılık, nedense programı takip etmek ve programı okumak zor falan diyenler çıkıyor.

Eğer küçücük bir fonksiyon içinde  goto kaynaklı takibi yapmak zor geliyor ise katman katman yazılmış yazılım örneklerini bu arkadaşlar nasıl kolayca anlıyorlar çok merak ediyorum.

Gotonun nerede kullanılması durumunda işler korkutucu olmaya başlayacak konusuna açıklık getirmek için fonksiyon içinden br başka fonksiyona goto ile atlama konusunu örnek getirdim.

Yoksa bana ne C'den bana ne goto dan.

Fakat boş zamanınızda uğraşmanız için bir C örneği hazırlayacağım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bocek

Alıntı yapılan: mufitsozen - 20 Ekim 2015, 16:46:27
Hayir. Bu program stack'i dogru pozisyona almadigi icin buyuk ihtimalle gittigi fonksiyondan return ederken crash eder.
Hayır hocam crash etmiyor (Arduino'da denedim). Çünkü ilk önce foo() fonksiyonunu çağırıp 'zipla' label'inin adresini öğreniyoruz.
Ancak anlamsız bir kullanım olduğu kesin olmakla beraber @z hoca 'goto' ile fonksiyondan fonksiyona gitmekten bahsettiği için öyle bir örnek verdim.
Ayrıca verdiğim örnek 'computed goto' kullanımına da örnek teşkil ediyor ve 'goto sadece aynı fonksiyon içinde kullanılabilir' kuralını da çiğniyor.

Peki bu bilgi gerçek hayatta ne işimize yarar? Hiç bir işimize yaramaz :)
1 ya da 0. işte 'bit'ün mesele..

mufitsozen

Alıntı yapılan: bocek - 20 Ekim 2015, 20:15:22
Hayir hocam crash etmiyor (Arduino'da denedim). Çünkü ilk önce foo() fonksiyonunu çagirip 'zipla' label'inin adresini ögreniyoruz.
Ancak anlamsiz bir kullanim oldugu kesin olmakla beraber @z hoca 'goto' ile fonksiyondan fonksiyona gitmekten bahsettigi için öyle bir örnek verdim.
Ayrica verdigim örnek 'computed goto' kullanimina da örnek teskil ediyor ve 'goto sadece ayni fonksiyon içinde kullanilabilir' kuralini da çigniyor.

Peki bu bilgi gerçek hayatta ne isimize yarar? Hiç bir isimize yaramaz :)



Programiniz "crash" etmiyor cunki orneginiz stackde degisiklik yapmiyor, bu yuzden stack"deki return address bozulmuyor.

Orneginizi stack'deki degerleri degistirecek kadar degistirince soyle oluyor:

#include <stdio.h>

void *ptr;

void foo(void)
{
   zipla:
   ptr = &&zipla;
}

int *goo(int *param,int *pdum1, int *pdum2,int *pdum3, int *pdum4){
int temp;

   *param = *param + *pdum1 + *pdum2 + *pdum3 + *pdum4;

    return param;


}
int main() {
    int y=8;

    int dum1=1;
    int dum2=2;
    int dum3=3;
    int dum4=4;

    int *pint;

   foo();

    printf("\n ilk y= %d",y);

   pint = goo(&y, &dum1, &dum2, &dum3, &dum4);

   printf("\n once y= %d \n",*pint);

   goto *ptr;

   printf("\n sonra y= %d \n",*pint);

   return 0;
}


Problem signature:
  Problem Event Name:   APPCRASH
  Application Name:   Visibility.exe
  Application Version:   0.0.0.0
  Application Timestamp:   562692f1
  Fault Module Name:   StackHash_0a9e
  Fault Module Version:   0.0.0.0
  Fault Module Timestamp:   00000000
  Exception Code:   c0000005
  Exception Offset:   00000012
  OS Version:   6.1.7601.2.1.0.256.1
  Locale ID:   1033
  Additional Information 1:   0a9e
  Additional Information 2:   0a9e372d3b4ad19135b953a78882e789
  Additional Information 3:   0a9e
  Additional Information 4:   0a9e372d3b4ad19135b953a78882e789



mesaj birlestirme:: 20 Ekim 2015, 22:32:24



sayin @bocek hocam, buraya yazdiginiz ornekler bir cok arkadas tarafindanda okunuyor. YANLIS ornekler onlarinda YANLIS bilgiler ogrenmelerine sebep oluyor.

Lutfen herkese acik bir forumda cevap yazarken biraz daha teknik dusunup dikkatli olalim.

Cok yogun oldugum bir donemde sirf yazdiginiz bilgi okuyanlari yanlis yonlendirmesin diye cay molami bu is icin harcadim, bilmenizi istedim.



mesaj birleştirme:: 20 Ekim 2015, 22:44:15


Alıntı YapAyrıca verdiğim örnek 'computed goto' kullanımına da örnek teşkil ediyor ve 'goto sadece aynı fonksiyon içinde kullanılabilir' kuralını da çiğniyor.

Ayni zamanda bu cumlenizde YANLIS oluyor. ve "Su-i misal emsal teşkil etmez"; yani "kötü misal örnek oluşturmaz. kuralina IYI bir ornek oluyor.

Okuyanlarin dikkatine: INTERNET'de GORDUGUNUZ BUTUN ORNEKLERI YADA YAZILANLARI  DOGRU KABUL ETMEYIN! bu benim yazdiklarim ve verdigim ornekler icinde gecerlidir.

SADECE belli bir redaksiyon (editing) surecinden, ve "process of peer review"den gecmis kitap, makale ve benzer yayinlardaki ornekleri dogru kabul edin (onlara bile supheyle yaklasin.)



mesaj birleştirme:: 20 Ekim 2015, 23:18:32

Alıntı yapılan: z - 20 Ekim 2015, 18:20:56
Müfithocam haricinde bu işi yaparım diyen varmı?

Özellikle de C de goto kullanmayın zırvası yapanlardan.

@z hocam, bu isi yaparim diyenlerden olmama ragmen, son 15 senedir yazdigim 2 kucuk program haricinde hicbir c programimda "goto" kullanmadim.

Daha oncede dedigim gibi, "error/exception handling" icin bu sekilde program akisini normal mecrasindan cikartmak icinde  uygun bir sekilde tasarlanmis bir mimari yapi icinde setjmp/longjmp kullaniyorum.

Bu forumda tartisirken kullandigimiz ornekler sadece entellektuel/zihinsel merak yuzunden veriliyor. Gercek ve profesyonel uygulamalarda kullanilan kabul gormus kural ve teknikler kullanilmamasi zaman icinde ciddi problemler yaratabilir, onun icin onlara istisna olabilecek konulara kafa yormak yerine belli bir tecrube kazanana kadar bu kurallara uymak daha dogru olur.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.