Evet arkadaşlar sorum aslında sadece başlıkda yazdığımdan ibaret, c kullanalar goto komutunu kullanmayı tavsiye etmiyorlar diye biliyorum, evet kullanmayın diyorsanız nedeni nedir, yoksa gönül rahatlığıyla kullanabilir miyiz?
Şu ana kadar asm ile epey program yazdım, 1-2 aydır ccs kullanıyorum, c de iyi güzel program yazıyorum istediğimi yaptırıyorum ama belkide uzun yoldan veya gereksiz algoritmalarla işi çözüyorum bazen, bunu önlemek için bazı detaylarıda öğrenmeye çalışıyorum, özellikle öğrenme aşamasında doğru yöntemlerle ilerlemek isterim. Bu yüzden başka hususlardada tavsiyeleriniz varsa açığım.
Asm de en son FAT dosya sistemli sd kart okuma yazma işlemini yarım yamalak gerçekleştirdim 16f ve dspic30f2010 kullandım, asm de bu noktaya gelene kadar yazdığım programları belşirtmeme gerek yok sanırım.
CCS de 1 wire lcd kütüphanesi yazdım (idare ediyor ama bazen sapıtıyor), çalıntı bir usb uygulamasını geliştirdim, dokunmatik ekran glcd kullandım, adc falan uyguladım, Serdar Çiçek hocanın kştabındaki uygulamarı inceliyorum.
Bunları söylememin sebebi, bu işle uzun müddet uğraşmayı düşünüyorum ve yaptıklarımın üstüne ne koyabilirim, nasıl kendimi geliştirmeliyim sorularına karşı fikirlerinizi almak.
En önemli sebeplerden birisi C'de fonksiyon yapısı olduğu için goto kullanılmaz. Zaten C'de nereye gideceğiniz, fonsiyonu çağıran main fonksiyonu tarafından belirlenir. Çünkü algoritma tümü ile hiyerarşik bir yapı gösterir. Bu, compilerin daha optimizasyonel bir kod üretmesini, anlaşılır bir program yapısı kazanmasını ve kolay debug edilebilmesini sağlar.
Assembly de (özellikle çok sayıda) kullanmak doğru olmayabilir. Onun yerine alt programlardan return ile dönmek daha mantıklı. Zaten assemblydeki call komutunun karşılığı, c'deki fonsiyon çağrılması ile denk denilebilir.
Complier ın optimize kod üretmesi içinse tamam, güzel dikkat etmeliyim o zaman, ayrıca programcının hata yapma olasılığını yükseltmek gibi bir etkisi var mı olur mu?
Hocam misal şöyle bir durum var, bir menüdeyiz saat ayarı yaptırıyoruz, dakikaya değer giriliyor, değeri kullanıcı 59 dan büyük girdi, bu yüzden dakika ayar yanlış dedik düzgün girsene be adam dedik, ve dakika ayar kısmını tekrar kullnucıya sunuyoruz nasıl yapmalı;
(aslında bu gotonun aklıma takılmasının sebebi bir arkadaşa program yazarken yardım ediyordum, bu ayar için goto kullanmıştı kullanma dedim, niye dedi öyle diyorlar dedim, dedim ama nedenini bilmediğim için dinletemedim)
Örneği sadece mantığı için öylesine yazıyorum,
dakika:
if (dakikabutonuna basıldıysa)
{
printf (... dakika değerini giriniz);
(keypad den girilen değeri okuduk dak değişkenine aldık diyelim)
if (dak>=60)
{ goto dakika }
yok 60 dan büyük değilse buradan artık varsa diğer ayarlara yoksa mesela aldığımız değerleri saat entegresine yazmaya geçiyoruz
Ben bunu goto kullanmadan şöyle yaparım diye düşünüyorum ama buda hoşuma gitmiyor
if (dakikabutonuna basıldıysa)
{
d=0; //d değişkenini 0 yap
while (d==0)
{
printf (... dakika değerini giriniz);
(keypad den girilen değeri okuduk dak değişkenine aldık diyelim)
if (dak<=60)
{ d=1 } // artık doğru dakika değeri alındı while döngüsünü tekrar işleme
}
}
yok 60 dan büyük değilse buradan artık varsa diğer ayarlara yoksa mesela aldığımız değerleri saat entegresine yazmaya geçiyoruz
Yoksa bu işi ek bir d değişkeni kullanmadan veya daha basit bir şekilde nasıl çözeriz.
Aşağıdaki alıntı belki tatmin edebilir bu düşüncede.
Alıntı Yapgoto yapısıyla gelen esneklik, ilk bakışta oldukça güzel görünüyor. Ancak goto için birçok kaynak, "ya hiç kullanmayın ya da olabildiğince az kullanın" demektedir.
Okunup, anlaşılması zor ve üzerinde çalışılması güç bir koddan, herkesin uzak durması gerekir. İngilizce'de, karman çorman koda, "spagetti kod" adı verilmiştir. goto deyimi, kodunuzun spagetti koda dönüşmesine neden olur. Çünkü program akışının takibini zorlaştırıp, kodun okunabilirliğini azaltır. Diliyorsanız, goto deyimini kullanabilirsiniz. Ama zorunlu kalmadıkça kaçınmak en iyisi...
kaynak: http://www.cagataycebi.com/programming/c_programming/c_programming_5.html (http://www.cagataycebi.com/programming/c_programming/c_programming_5.html)
Selam,
C nin yapısından tutun da kod üretme kısmına kadar bir çok sebepten dolayı goto kullanımı tavsiye edilmez. Goto ile dallanacağınız kısmı bir fonksiyon içerisine alır, o fonksiyonu çağırırsınız. Zaten alışkanlık kazandığınızda siz de goto sevmeyeceksiniz. Üniversitedeki hocamız, goto gördüğü anda kağıdı kırmızı kalemle diagonal çizerdi.
Analyzer
Alıntı yapılan: RaMu - 18 Mayıs 2013, 00:07:58
Complier ın optimize kod üretmesi içinse tamam, güzel dikkat etmeliyim o zaman, ayrıca programcının hata yapma olasılığını yükseltmek gibi bir etkisi var mı olur mu?
Elbette olmaz. Program daha kolay okunabilir olduğu için hata yapma oranı azalır.
Goto bir uzak dallanma komutudur. Hemen peşindeki komutları işlemeksizin ve geri dönmeksizin atladığı için risklidir. O amaçla kullanılması önerilmez.
Birinci örnekte dakika adında ayrıca bir fonksiyon oluşturabilir, birinci fonksiyondan dönen değeri dakika fonksiyonunda kullanabilirsiniz.
Goto ile zaten bir fonksiyondan diğer bir fonksiyona sıçrayamazsın ASM'deki gibi ;
2000 küsür satırlık bir CCS kodumdan altıntı yapıyorum hocam ; bu gördüğün bölge sadece main blogu oda ayarlarla dolu zaten büyük kısmı :D
void main()
{
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_8);
disable_interrupts(GLOBAL);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
// TODO: USER CODE!!
glcd_init(ON);
// animasyon();
glcd_showimage1();
delay_ms(4000);
glcd_init(ON);
sayi=1;
buton=0;
while(1)
{
adc_topla();
buton=buton_tara();
buton_isle(buton);
karar_ver();
}
}
Anlatmak istediğim o ki 2000 küsür satıra sadece fonksiyon kullanarak geldim ayrıca her fonksiyon kendi içinde fonksiyonlara ayrılıyor tıpkı bir ağacın dalları gibi.
Bu sayede hata olan noktaları temizleyip düzeltmek kolay oluyor.
Bir avantajı daha var kullandığın her fonksiyonu hiç değiştirmeden yada ufak eklentilerle başka programlarda çok rahat geçmiş kütüphane şeklinde hazırladığın fonksiyonları kullanmakta ayrı bir keyif veriyor insana :)
Merhaba, C'de her fonksiyon tamamlandıktan sonra bir üst fonksiyona geri döner. En üst fonksiyon olan main() yada windows uygulamaları için WinMain() tamamlandıktan sonra program sonlanır ve varsa işletim sistemine bir parametre ile geri döner. Her fonksiyon çağrıldığında yığında o fonksiyon için yer ayrılır ve iç içe fonksiyonlar için bu dallanıp budaklanır. İyi bir c programcısı her fonksiyonun geri dönüş değerini ve sırasını takip edebilmelidir. Goto kullanımında yığında yer ayrılmaz, doğrudan belirtilen etikete dallanma sağlanır ve fonksiyonlar neredeyse göz ardı edilir. Goto ile dallanılan yerdeki komutlar icra edildikten sonra program akışına devam eder ve ilk fonksiyon bloğu sonlandığında yığına gidip dönmesi gereken yeri ve parametreleri yığından almak istiyecektir. İşte bu noktada bir fatal error oluşabilir :) siz daha önce goto'nun içinde bulunduğu bir fonksiyondan bir üst yada daha üst bir fonksiyon içerisinde bir yere dallandıysanız, o fonksiyon geri dönüşte yığındaki en son girdiyi çekecektir ancak bu çektiği kendi bilgisi değil alt fonksiyonunun bilgisidir. Basit programlarda goto'nun takibi kolay olabilir ancak program karmaşıklaştığında goto'nunda diğer fonksiyonlarında takibi zorlaşır. Goto kullanmak bu yüzden tehlikelidir. Şu an aklıma sadece bu senaryo geldi, daha farklı senaryolarda oluşabilir..
fehmi_asm Birinci örnekte dakika adında ayrıca bir fonksiyon oluşturabilir, birinci fonksiyondan dönen değeri dakika fonksiyonunda kullanabilirsiniz. bunu çözemedim, nasıl yani?
Arkadaşlar teşekkür ediyorum değindiğiniz noktalar önemli bilgiler içeriyor. Yani bende kod yazarken işlemi en kısa sürede yapacak, en az kod satırı kullanacak (derlendiğindede), okuması debug işi kolay, modüler-başka programlarda kullanılabilecek şekilde kod yazmanın gerektiğini düşünüyorum, bunu herhalde kod yazdıkça ve güzel yazılmış örnek kodları inceledikçe öğreneceğiz, yazdığım örnekleride arada eleştirebilirseniz sevinirim örnek üzerinden gitmek daha kolay olur diye düşündüm.
MrDark evet uzun kodlar adamı çileden çıkarabiliyor, bu yüzden işi kolaylaştıracak yöntemleri kullanmalı, şimdi buna örnek söyleyebilmeme zor ama misal birçok duruma karşı birçok cevap verecek, menüleri ayarları olan, dışarıdan gelen verilere, buton - sensör vs. göre çeşitli çıkışlar üreten bir program yazdığımızda, if içinde 10 tane if, while içinde while lar ifler do lar ile karşılaşıyorum bunlarda programı karıştıryor, bu if nerede başlamıştı bu kapanan parantez hangi döngümnündü diye aranıp duruyorum, bakalım çözeceğiz artık, bulacağız doğru yolu :)
Birde böyle olabilir diye düşünüyorum,
if (dakikabutonuna basıldıysa) // dakika ayar butonuna basıldıysa ayar fonksiyonuna girecek
{
do // dak değeri ne olursa olsun do içi en az bir defa işlenecek
{
printf (... dakika değerini giriniz);
(keypad den girilen değeri okuduk dak değişkenine aldık diyelim)
}while(dak>=60); // kullanıcının girdiği dak değeri 60a eşit veya
// büyükse do kısmı (dakika ayar)tekrarlanacak,
//küçükse değer doğru-while içi yanlış,do-while dan çıkılacak
}
buradan artık varsa diğer ayarlara yoksa mesela aldığımız değerleri saat entegresine yazmaya geçiyoruz
Sorunuzu biraz geç gördüm fakat yanıtlamak isterim. İlk olarak sizinde kendizi ifade ettiğiniz gibi bende kısaca kendimi ifade edeyim ilk ticari programımı 1985 yılında satmıştım ( evet yazım hatası yok 28 yıl evvel gerçi bana dün gibi geliyor) bu sitedeki arkadaşların ortalama yaşı bana göre çok genç olduğundan sizide öyle varsayıyorum bu sorunuz beni oldukça memnun etti. Şimdi birçok programcı kelimeleri geçtim kısaltmaları bilmekle övünüyorlar. Bizim zamanımızda bir dizinin sıralama methodu (algoritması) olarak yaklaşık 20 çeşidinide peyderpey öğrenmiştik. Bence algoritma programcının kendisine en kolay yolu seçmesiyle başlar yok goto kullanma yok hatırlatıcı notlar yaz bana göre bunlar hikaye ben fazla kasmayayım ama 20 sene önce yazdığım kodu bile görünce hatırlarım. Benden sana tavsiye bunu muhakkak araştır bubble sort ile quick sort arasındaki farkı anladığında sorunun karşılığını tam olarak öğreneceksin. Ben program yazarken her programın optimum olacak diye bir kaide olmadığından çoğu kez ezberden bubble sort yazarım gider ama bu fonksiyon çok kullanılacaksa hızdan düşmemek için quick sort yazmayı tercih ederim işte hikaye olmayan kısmı bu. Gelelim goto meselesine; şimdiki bir kısım c programcısı veya geniş tutalım c,c+,c++,c# bu dillerin sosyete programcılığını yapıyorlar, eskiden de pascal sosyetesi vardı neyse; ezberden aman goto kullanma etiğini devam ettiriyorlar. Acizane benim yorumum programlama dilinin recursif olup olmadığı ile ilgilidir. Ne zaman ki pascal çıktı programlama dünyasına recursif niteliğini koydu ( çoook iyide oldu ) goto komutu istenmeyen komut oldu. Şimdi hepimiz biliyoruz ki goto komutu en temel komuttur ve kullanılır sebebine gelince diller anası assembler değilmi tüm derleyiceler (c,pascal,fortran,basic ve sülaleleri ) vardıkları noktada barnch komutlarında goto yokmu var. İşin komiği bir zamanlar while..do, do..until komutlarında da gizli if var diye tü kaka olmuştu ( oldum olası bende pek sevmem bu iki komutu) . Programcının eliti bırakınız goto komutunu if then else komutunu bile çok kullanmamalıydılar. Bir zamanlar ODTÜ'de sıralı bir dizide var olan bir sayının kaçıncı sırada olduğunu if..then..else komutunu kullanmadan yapınız sorusu oldukça meşhurdu. İlk arabamı aldığımda bana o zamanlar çok moda olan tubeless lastik aldırmışlardı abi bunu al lastik patlasa bile baya yol gidersin diye ya baya yol ne kadar diye amma kafa yormuştum herkese sordum en sonunda bir abi lastiğe küçük bir çivi girse ve sende çıkarmaz isen lastikçiye kadar gidersin ama delik büyükse bir yere gidemezsin demişti. Bence Goto komutuda bu değerdirmeye giriyor. Ticari program yapmışsın oldukça iyide satıyor içindeki goto sayısından kime ne veya kim kime maddi kazanç beklediği bir programın kaynağını gösterir ki? ha 3 satırda yazmışsın ha 3000 satırda bunlar işin hikayesi. Benden sana tavsiye aman goto kullanma diyenlere sor bakalım assembler'da NOP komutu ne işe yarıyormuş. Cevaba göre işim sosyetesindemi değilmi anında anlaşılır. Assembler'da program yazabilen bir arkadaş değişik projeler yaptığında Algoritma bigisi ister istemez yükselecektir. Bir projede hafıza yetmeyecek , diğerinde hız yeterli olmayacak, diğerinde real time olması gerekecek bunları aşmayı başardıkçada eskiye nazaran ne kadar çok bilgilendiğini zaten kendin anlayacaksın. Lafa bakarmısın az kullanman veya hiç kullanmaman gerekir ne bu ya ilaç mı, üç beyazdan birimi hani bilgisayarda sadece sıfır veya bir vardı. Ben çok kullanınca ... problemi olurmuş o benim değil derleyicinin problemidir. Stack problemi üzerinde duranlar için Faktöriyel Hesaplama programını recursif yazıp denemelerini tavsiyede ederim çok büyük bir sayı girildiğinde bile nasıl çalışıyor görülür tamam bu ... derleyisinde olmadı veya yavaş o zaman LISP'te yazıp farka bakabilirler. Program uzun olunca anlaşılmazmış ne o mikrokontroler'a muhasebe programımı yazıyoruz. Bana 100 satırlık algoritmik özelliği olan bir program göstersinler veya quick sort programının satır sonlarına bir açıklama yazsınlarda göreyim. Ben bunca yıllık mesleki yaşamımda 50 satırı aşan algoritma görmedim.
Dakika alma işine gelince ben olsam ilk tuş basıldığında 6,7,8,9 tuşlarından biri ise kaale almam beklerim, ikinci tuşu ise tamamen serbest bırakırım.
"İnsan başkasının yumruğunu yemeden, kendi yumruğunu Balyoz zannedermiş.." özet olarak bubble sortu yapan abi quick sort'u görünce bence biraz imrenmiştir. Aslında bunca uzun yazıyı okuyan varsa hakikaten teşşekkür ederim.
iyi çalışmalar
Qaravul
Not: Yukarıda yazdıklarımdan lütfen forumdaki arkadaşlar alınmasın kimseyi yermek gibi bir niyetim yoktur. 28 yıllık tecrübeme dayanarak yaşadıklarımın özetini yazdım. Tüm programcı gençlerin kimsenin iyisin, kötüsün demesine aldırmaksızın projelerini tamamlasınlar ve kendi değerlerini kendileri biçsinler. Hatasız çalışan programı yazdığınızda iş biter.
2.not :yazım hatası yapmışım düzeltmeme yardımcı olmanızdan dolayı ahmets arkadaşa teşşekkür ederim.
Alıntı Yapilk ticari programımı 1985 yılında satmıştım
yazı uzun, sıkıcı. sadece buraya kadar okudum. tebrik ederim sizi
"Yeni" üye bezgin'in yazısını okudum.
Katıldığım yerleri var, anlamsız gelen yerleri var.
Son cümleye takıldım.
Alıntı yapılan: bezgin - 21 Haziran 2013, 10:03:43
... Hatasız çalışan programı yazdıklarında iş biter.
Hatasız çalışan program yazıldığında iş bitmez. Bu yüzden goto kullanılması tavsiye edilmez.
İsterseniz bana bir tane hatasız yazdığınız programın çalışan exe'sini gösterin. Kullandığınız goto'ların nasıl sorunlara yol açabileceğini örnekleyerek açıklamaya çalışayım.
Burası demokratik bir ülke kardeşim isteyen istediğini kullanır :)
Şaka bir yana bu tür "kullanılmamalı" tarzı önermeler birer tavsiyeden ibarettir ve yazılım mühendisliğinde ortak olarak karşılaşılan problemler sonucu ortaya atılmıştır. Ama biz her seferinde neyi tartışıyoruz orayı anlamıyorum.
@bezgin kardeş programlarını da, mesajını yazdığın tarzda yazıyorsan bir çok sorunlara gebe olması muhtemel.
Mesela 'enter'a basmayı pek sevmiyorsun (az sayıda satır ile işi bitirmek), ODTÜ'deki sıralama algoritmasından bahsederken birden "tubeless lastik" mevzusuna atlıyorsun (goto kullanımı) vs.
Programın çalışıyor olması sorun çıkarmayacağı anlamına gelmiyor elbette. 10 yıldan fazladır binlerce kişinin kullandığı bir PC programı bunca yıldan sonra işgüzarın birinin lüzumsuz bir girişi sonucu hata verebiliyor. Düşünün binlerce kişi kullanmış bir şey olmamış, 'o' şahıs kullanmış hata vermiş:) Oluyor böyle şeyler. Onun için de 'elit' kesimin tecrübelerine hor gözle bakmamak lazım.
Kusura bakma tecrübene ve çıkardığın işlere saygı duyarım ama bu goto mevzusuna bu kadar atarlanmak ta gereksiz bence.
İsteyen kullansın, ben kullanmam. Hiç kullanmadım daha.
Alıntı YapSorunuzu biraz geç gördüm fakat yanıtlamak isterim. İlk olarak sizinde kendizi ifade ettiğiniz gibi bende kısaca kendimi ifade edeyim ilk ticari programımı 1985 yılında satmıştım ( evet yazım hatası yok 28 yıl evvel gerçi bana dün gibi geliyor)
Sayin @bezgin, bende ilk programimi 1974 senesinde yazdim ve bir suru goto vardi (yazim hatasi yok, ama bana dun gibi gelmiyor maalesef!).
Ama 1984 senesinden beri hataya yol acan ve anlasilmasi guc durumlara sebep olmasindan dolayi cok nadiren goto kullaniyorum.
Nadiren goto kullanmanin avantaj sagladigi durumlar olabilir ama butun modern dillerde goto kullanmadanda daha kolay yazilan ve anlasilan programlar yazilabilir, bu bir egitim meselesidir. (yani egitim sart!) :P
bu arada ODTU elektrik elektronik mezunuyum, ve ogrenim surem boyuncada ODTU bilgisayar Merkezinde Asistan ogrenci olarak calistim.
Fakat bu tip bilgilerin hicbir anlami yok, belkide su anda 15 yasinda bir lise ogrencisi benden daha iyi/cabuk/hizli/dogru/kompakt program yazabiliyordur!
mesaj birleştirme:: 21 Haziran 2013, 16:16:23
Bu konuda daha "seviyeli" yada "teknik" bir tartisma yapmak isteyenler, kisa bir ozet icin Microsoft Press'den "Code Complete" kitabinin 17.3 bolumune bakabilir.
Benim nacizane fikrimi sorarsaniz, bu kitap zaten programciyim diyen herkesin, kutuphanesinde bulunmasi ve bastan sona değilse bile, programlama ile konularda ilk olarak bakilacak referans kitaplardandir.
'goto kotudur' diyenlerde 'goto kullanilabilir' diyenlerde yuzeysel tartismalar yapmak yerine en azindan bu kitaba basvurabilirler.
bu arada bu konunun ilk defa tartisma konusu olmasi 1968 yilinda Edsger Dijkstra nin ACMde yazdigi "Go To Statement Considered Harmful" mektubu ile baslar!
Bu konuya bir aciklama olmasi bakimindan bahsi gecen kitapdan bir bolumu asagiya ekliyorum.
Alıntı YapIn some cases, the goto can result in faster and smaller code. Knuth's 1974
article cited a few cases in which the goto produced a legitimate gain.
Good programming doesn't mean eliminating gotos. Methodical decomposition,
refinement, and selection of control structures automatically lead to goto-free
programs in most cases. Achieving goto-less code is not the aim, but the
outcome, and putting the focus on avoiding gotos isn't helpful.
Decades' worth of research with gotos failed to demonstrate their harmfulness.
In a survey of the literature, B. A. Sheil concluded that unrealistic test
conditions, poor data analysis, and inconclusive results failed to support the
claim of Shneiderman and others that the number of bugs in code was
proportional to the number of gotos (1981). Sheil didn't go so far as to conclude
that using gotos is a good idea—rather that experimental evidence against them
was not conclusive.
Finally, the goto has been incorporated into many modern languages including
Visual Basic, C++ and the Ada language—the most carefully engineered
programming language in history. Ada was developed long after the arguments
on both sides of the goto debate had been fully developed, and after considering
all sides of the issue, Ada's engineers decided to include the goto.
Bu sıralar biraz yoğun olduğum için forumu takip edemiyorum,
yazılan mesajları yeni gördüm,
içerisinde gerçekten duymak istediğim bilgiler var,
bubble sort ile quick sort, recursif, Microsoft Press'den "Code Complete" kitabinin 17.3 bolumu ... vb.
bu konuları uygun bir zamanda araştırıp aradığım cevaplar bunlarda mı gizliymiş bakacağım.
Teknik tartışmaya devam edilirse hoşuma gider, veya bu konunun veya benzerlerinin ele alındığı kaynaklara yönlendirilirse güzel olur.
goto kullanmayın denir çünkü pipeline'ı sıfırlar, pipeline'ı tekrar doldurmak için zaman harcanır ve programı okurken zorlaştırır
bu konu daha önce forumda anlatıldı. detaylar için forumda veya google da aratma yapabilirsiniz.
Laf olsun diye goto kullanilmamalidir. Goto komutu pipeline bufferi siler ve islemci buffer dolana dek yavas kosar.
Goto kullanma goto ile gidecegin kismi fonksiyon yap onerisi bu durumda ise yaramaz cunku Call komutu da Goto gibi pipeline bufferi sifirlar.
Goto kullanmadan program yazsanizda derleyici gerekiyorsa makine dilindeki Goto komutu kullanilacaktir.
Goto kafa karistirir, programin okunurlugunu zorlastirir iddiasina da cok sicak bakmiyorum.
Eger goto komutu ile kafalar karisiyorsa, kisa kod yazma ugruna yapilan sadelesmis kod parcalari daha fazla kafa karistirir.
Debug asamasinda rahatlamak istiyorsan olabildigince cok fonksiyon yaz.
Bu optimum makine kodlarindan cok uzak kod uretimine neden olsa da, herhangi bir problemle karsilastiginda amiral batti oyunundaki gibi basit mantik yurutumu ile kolayca sorunu yakalarsin.
Goto programin debug edilmesini zorlastirir. Neden zorlastirir onu anlatmak icin uzun yazi yazmak lazim.
Debug asamasinda rahatlamak istiyorsan olabildigince cok fonksiyonyaz.
Eski makinalar geldi aklıma, yanlış biliyor olabilirim hani şu bant kasetli sistemler veya
kağıt üzerine delikler şeklinde yazılı programları işleten makinaları diyorum,
bunlarda goto kullanmak ne derece mümkündü veya call, program memory de dolaşılabiliyor muydu?
Bence hayır, günümüz mikrodenetleyicileride prog memory e ulaşırken kısmen zorluk yaşıyor anlaşılan,
pipeline konusunu net bilmiyorum ama asm den karşılaştığım kadarı ve z hocam sizin anlattığınız
mikrodenetleyici çalışma prensibi, şu mikroişlemci ram program memory basit bir md yapımı gibi konusundan anladığım kadarıyla bilgim var pipeline konusunda,
önemli problem pipeline diyorsanız tamam,
aslında benim sorumda yetersiz,
bir programdan ne bekleriz,
hız - güç harcama, güvenilirlik veya program kolay yazılsın md. kaynaklarını sömürsün,
vs. programın amacına ve kullanım alanına, yazımına göre herhalde soru değişik
cevaplar alabilir.
Benim gibi şuanda c kullanarak profesyonel programlar yazmayan biri için goto kullanıp kullanmamak keskin bir çizgi, kesinlikle kullanma gibi bir durum oluşturmuyor anlaşılan,
yinede gelecekte bu işi sürdürmek niyetinde olduğum için goto kullanmamam gerektiği sonucunu çıkarıyorum.
Asmde her zaman debug yapardım, ccs c ,le kod yazıyorum şuanda ve neredeyse hiç program vasıtasıyla debug yapmadan, sürekli gözle takip ediyorum programı, bunun temel sebebi derleyicinin debug işlemini doğru düzgün kullanamamam,
hatta bu sebeple ccs c de yazdığım programı mplab ile açıp mplab üzerinden debug yaptım birkaç defa, insan alıştığı platforma güveniyor haliyle :)
delikli band ve teypden program yukleyen makinelerde elbette goto vardi. program teyp vs den okunup rama aktariliyor ve ramda gotolar cirit atiyor.
makine dilinde Goto olmayan MCU olamaz. illaki program counter uzerinde islem yapan komuta ihtiyac var. Bunun en basit haline GOTO demisler.
Sen goto kullanmayacagim diye kendini sartlama. Once kotu kodlamayi becer sonra sonra ustalasirsin.
haaa unutmadan, kodlarinda bir tane bile goto kullanmadim diye usta oldum sanma.
Efsane bunlar.
Hocam ağzına sağlık çok güzel söyledin.
Ben delikli banddan program işletiyor diye biliyordum,
ram e aktardığını hiç düşünmemitim.
Goto komutu kullanmak ölümü beraberinde getirir gibi yazan arkadaşlara bende katılamayacağım çünkü compile esnasında zaten goto kavramları oluşuyor programcı istediği kadar goto dan kaçınsın sonuçta compiler a da nasıl çevireceğini biz gösterecek değiliz. Bu nedenle zorda kalındığında goto kullanmaktan yanayım bu güne kadar sorun yaşamadım. Optimum kodmu üretiyorum gibi şizofrenilere girmeden söylemek isterimki limitli miktarda goto kullanan bir programcıya amatör denmez
Bir ilave yapayım, örnek kod olmadan açıklamaya çalışayım.
Daha önce @z söylemiş, ne kadar çok fonksiyon yazarsanız kodu takip etmek ve debug iileminde kolaylık yaşarsınız.
Genelde GOTO kullanımı iyi değildir. Şu hususta GOTO kullanımı iyidir.
Eğer bir fonksiyon içerisinde birden fazla return noktanız varsa iş o zaman karışacaktır. O zaman o fonksiyon içerisinde birden fazla return noktasını goto ile tek bir nokta (label) yönlendirmek ve o noktadan tek bir return ile dönmek, kod takibi ve özellikle debug işlerinizi kolaylaştıracaktır.
bu bakış açısı ile ilgili. eğer yazdım, gömdüm çalışsın yeter bakış açısıyla yazarsanız goto kuyllanıp kullanmamanız önemli değil. ama geliştirme aşamasında güvenirlik önemliyse, bir standarta bağlıysanız ve kodun okunabilirliğini ve bakımkolaylığını arttırmak istiyorsanız goto kullanımı mantıksızdır.
ayrıca safety critical programming'te multiple return kullanımı da yasaktır(okunabilirlik). bu yüzden multiple return içinde goto kullanmak aslında bir hikaye vardır, tam ona örnek oluyor(uzun hikaye, içinde kurban, hz. isa falan olan)
C 'de "goto" optimize edilmeden
direkt asm koduna çevrilmez mi?
Page değiştiren bir kod içersinde
karışıklığa sebep olmaz mı bu durum?
Alıntı yapılan: berat23 - 13 Aralık 2014, 12:30:48
bu bakış açısı ile ilgili. eğer yazdım, gömdüm çalışsın yeter bakış açısıyla yazarsanız goto kuyllanıp kullanmamanız önemli değil. ama geliştirme aşamasında güvenirlik önemliyse, bir standarta bağlıysanız ve kodun okunabilirliğini ve bakımkolaylığını arttırmak istiyorsanız goto kullanımı mantıksızdır.
ayrıca safety critical programming'te multiple return kullanımı da yasaktır(okunabilirlik). bu yüzden multiple return içinde goto kullanmak aslında bir hikaye vardır, tam ona örnek oluyor(uzun hikaye, içinde kurban, hz. isa falan olan)
Dostum orjinalden okumanı tavsiye ederim ...
http://www.cprogramming.com/tutorial/goto.html (http://www.cprogramming.com/tutorial/goto.html)
Diğer yorumları okumadım ama şunu söylemek istiyorum:
BASIC dilinde 1-2 ay program yazın. Sonra neden goto kullanmamanız gerektiğini anlarsınız.:D
KONU hortlamış ama problem değil,
bu sayede bende bu güne kadar c ile uğraşırken nedenini anladım.
Söylenenlerin belkide hepsi doğru denebilir,
c ile program yazdıkça bende goto kullanmanın
yarardan çok zarar getirdiği kanısına vardım,
nedenleri aynen yukarıdaki mesajlar,
bence goto kullanıyorsan c kullanmanın anlamı yok.
sıft hiç bir şey bilmediğim halde, ve hiç bir şey bilmeyen birinin düşüncesini merak ediyorsanız, düşüncem bunlardır ve bu sebepten üye oldum
Tüm yazılanlar, gerekse tercüme ederek, gerekse defalarca anlamaya çalışarak okudum
Ben proğramlama ya yeni başladım , ve en sağlıklı cevabı vereceğimi düşünüyorum
goto deyimini daha proğramlama bilmeden ne olduğunu biliyordum,ve ilk öğrendiğim şey bu deyimi nasıl kullanacağımı
aklımdaki bir çok projeyi, acemi olduğum halde bu deyimi kullanarak çok sayıda yazılım yaptım
ve şuna kanat getirdim;
goto deyimi işin kolay yanı ve bir o kadar eğlenceli; )
işin aslını öğrendikçe ve kendimi geliştirmek için bu deyimi olabildiğimce en az kullanmam gerektiği anladım
bunu kısa olarak şöyle örnek verebilirim,
bir postacı düşünün..
'a sokağına git ,13 numaraydaki evin ziline bas, postayı ver veya al sonra geri dön'
ama postacının elinde çok sayıda posta varsa, işi kısaltmak için en kolay yol için başka artarnatiflere baş vurulması gerekmektedir
sonuçta her ne şekilde olursa olsun bizim postacı o adrese uğrayıp o postayı sahibine verecektir, Amaç en kısa yoldan ;) teşekkür ederim.
Algoritma Algoritma Algoritma...
Gerisi teferruat.
En büyük sebebi programın okunmasını ve yazmasını zorlaştırmasıdır. Diğer sebepler sonra gelir. (Çünkü bir kaç yerde kullanılması daha verimli)
Bunu iyi bir şekilde anlamak için klasik Basic dili ile o satırdan bu satıra atlayan programlar yazın anlarsınız. Hatta internetten klasik Basic programları bulun kodu okumaya çalışın.
Ayrıntılar önemli.
Şeytan ayrıntıda gizlidir.
Alıntı yapılan: RaMu - 19 Ekim 2015, 10:07:56
Ayrıntılar önemli.
Şeytan ayrıntıda gizlidir.
2.Hort :D
Evet ama dün hortlatan arkadaşın ilk mesajıymış,
çok istemiş demek ki,
onun şerefine konunun ruhunu çağırdık :)
Şu konuya "yazılım kalitesi" diye bir başlık açıp oradan devam etsek. Sanki tek önemli şey goto kullanmak ya da kullanmamak gibi bir hava oluşuyor.
Alıntı Yap"yazılım kalitesi"
En iyi Algoritma +
En çok iş +
En az satır +
En yüksek paralel çalışma güvenliği +
=Kalite.
Alıntı yapılan: peko - 19 Ekim 2015, 14:03:25
En iyi Algoritma +
En çok iş +
En az satır +
En yüksek paralel çalışma güvenliği +
=Kalite.
En cok is ve en az satir, okunabilirlik dolayisiylada bakim kolayligi(surdurulebilirlik, maintainability), dusuk karmasiklik gibi kalite faktorleriyle celisebilir.
@vsalmaGoto kadar çelişmez :)
mekanik sistemler, çok az bir hata payı ile üretilmek zorundadır.
fazladan bir dişli, mil, vida koymak mümkün değildir. profesyonel yazılımlarda böyle midir?
her profesyonel yazılım tıkır tıkır işler mi? bir yerde fazladan kontrol, karşılaştırma, gecikme vs. kullanılmıştır sanırım.
basla:
print "profesyonel != çok iyi program"
print "profesyonel = para kazanılan program."
goto Basla
İçinde tek bir Goto komutu geçmeyen C programınızı verin Goto'lu hale getireyim.
Sonra derleyip exesini vereyim. Hangisi Goto'lu hangisi Gotosuz anlayın.
GOTO komutunu kullanmak yasak değil 4 satır kod yazdınız 2. satırdan 4. satıda goto ile atlamanız bişey değişitirmez. ANCAK bu komut fonksiyon geçişlerini ve özellikle C++ da çok kullanılan class yapısını baltalar. Bir fonksiyon çağırdığınızda çağırmış mı olursunuz çağırmamış mı? pointer void tanımlaması gerçek mi sanal mı? bu soruları sormadan goto kullanırsanız yazılım goto yaptığı adreste hiç hesapta olmayan stack bozulmaları yaşayabilirsiniz.
Akıcılığı bozmamak adına goto kullanmıyoruz compiler bizim için bu düzeni sağlıyor işini yaparken ona karışırsak kodumuzun taşınılırlığı kalmaz. Başka bir complier farklı yorumlayabilir. Asıl sebep bu.
@zAlgoritma değişikliği zaman farkı yaratır ve dolayısıyla anlaşılır hocam..
Ancak şuana kadar burada konuşulan bir çok yazılım için bu zaman farkı veya goto kullanıp kullanılmamasının hassasiyetine haiz bir duruma ben rastlamadım.
Bundan dolayı hissetmezsiniz diyorsanız evet, kimse kolay kolay farkedemez içerde nelerin değiştiğini..
Alıntı yapılan: mustafayilmaz - 19 Ekim 2015, 20:29:45
mekanik sistemler, çok az bir hata payı ile üretilmek zorundadır.
fazladan bir dişli, mil, vida koymak mümkün değildir. profesyonel yazılımlarda böyle midir?
her profesyonel yazılım tıkır tıkır işler mi? bir yerde fazladan kontrol, karşılaştırma, gecikme vs. kullanılmıştır sanırım.
Profesyonel yazılımlardan ne anladığımıza bağlı. Kullanıcı yazılımlarında birçok hata oluyor. Bunu, programı konsoldan çalıştırınca verdiği mesajları görünce anlamıştım. Ama askeri ya da sağlık alanında kullanılan bir yazılımsa olmamasını beklerim.
Makinelerdeki biraz daha garip. Makinede kalite ayrıntılarda. Portakal sıkacağı alıyorsun, ikisinin de sistemi aynı olan makinalardan biri çok kötü diğeri mükemmel.
Alıntı yapılan: X-Fi - 19 Ekim 2015, 21:37:45
GOTO komutunu kullanmak yasak değil 4 satır kod yazdınız 2. satırdan 4. satıda goto ile atlamanız bişey değişitirmez. ANCAK bu komut fonksiyon geçişlerini ve özellikle C++ da çok kullanılan class yapısını baltalar. Bir fonksiyon çağırdığınızda çağırmış mı olursunuz çağırmamış mı? pointer void tanımlaması gerçek mi sanal mı? bu soruları sormadan goto kullanırsanız yazılım goto yaptığı adreste hiç hesapta olmayan stack bozulmaları yaşayabilirsiniz.
Akıcılığı bozmamak adına goto kullanmıyoruz compiler bizim için bu düzeni sağlıyor işini yaparken ona karışırsak kodumuzun taşınılırlığı kalmaz. Başka bir complier farklı yorumlayabilir. Asıl sebep bu.
Bu durumda kurulu plak gibi goto kullanmayın-goto kullanmayın-goto kullanmayın demeye gerek yok.
Neden? Fonksiyonları Goto ile çağırmaktan hatta c++ dan bahsediyorsunuz. Yani artık 3 kağıt çekme aşamalarına gelindiğinden bahsediyorsunuz.
Taşınabilirliğin, belli standartlara uyulması gereken işlerde tamam patronların istediği disiplinde kod yazmak lazım.
Ama 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....
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....
;)
C de icine girilen bir foksiyonun herhangi bir satirindan bir baska foksiyonun herhangi bir satirina goto ile ulasabilen varmi?
bildiğim kadarıyla goto aynı fonksiyon içinde çalışır
fonksiyonlar arası geçiş için
longjmp fonksiyonu var
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)
şöyle oluyor galiba:
void *ptr;
void foo(void)
{
zipla:
ptr = &&zipla;
}
int main() {
foo();
goto *ptr;
return 0;
}
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 :)
Alıntı yapılan: mufitsozen - 20 Ekim 2015, 14:25:55
ben (ve gerbay ve 100binden fazla expert c programcisi)
crash etmeden işinizi görebilirmisiniz?
Alıntı yapılan: z - 20 Ekim 2015, 17:25:51
crash etmeden işinizi görebilirmisiniz?
evet
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?
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.
Müfithocam haricinde bu işi yaparım diyen varmı?
Özellikle de C de goto kullanmayın zırvası yapanlardan.
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.
Ö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.
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 :)
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.
Alıntı YapCok yogun oldugum bir donemde sirf yazdiginiz bilgi okuyanlari yanlis yonlendirmesin diye cay molami bu is icin harcadim, bilmenizi istedim.
Kusura bakmayın değerli zamanınızı boşa harcamanıza sebep olduğum için üzüldüm. Bence siz daha çok, 'hayır crash etmiyor' deyip size itiraz etmiş gibi olmama takılmışsınız ama gerek yoktu aslında. Böyle bir niyetim olamaz sizin karşınızda. Zahmet etmişsiniz ispata girişmekle.
Böyle kodların çok tehlikeli olduğunu, bir-iki yerde doğru çalışmasının her zaman doğru çalışacağı anlamına gelmediğini, genel kabul görmüş kuralların dışına çıkmamanın iyi olacağını belirtmeniz yeterli olurdu kanaatimce. Tabii aslında bu uyarıyı benim yapmam gerekirdi ama goto'yu bu şekilde kullanmanın 'anlamsız' olduğunu söylemenin ve bu bilgilerin hiçbir işimize yaramayacağını belirtmenin yeterli olacağını düşünmüştüm.
Burayı okuyan herkesi bilgilendirdiğiniz için de ayrıca teşekkür ederim.
Alıntı yapılan: bocek - 21 Ekim 2015, 00:32:22
Kusura bakmayın değerli zamanınızı boşa harcamanıza sebep olduğum için üzüldüm. Bence siz daha çok, 'hayır crash etmiyor' deyip size itiraz etmiş gibi olmama takılmışsınız ama gerek yoktu aslında. Böyle bir niyetim olamaz sizin karşınızda. Zahmet etmişsiniz ispata girişmekle.
Böyle kodların çok tehlikeli olduğunu, bir-iki yerde doğru çalışmasının her zaman doğru çalışacağı anlamına gelmediğini, genel kabul görmüş kuralların dışına çıkmamanın iyi olacağını belirtmeniz yeterli olurdu kanaatimce. Tabii aslında bu uyarıyı benim yapmam gerekirdi ama goto'yu bu şekilde kullanmanın 'anlamsız' olduğunu söylemenin ve bu bilgilerin hiçbir işimize yaramayacağını belirtmenin yeterli olacağını düşünmüştüm.
Burayı okuyan herkesi bilgilendirdiğiniz için de ayrıca teşekkür ederim.
Sizi cok hakli buldugumu belirtmeme izin verin. Bazen yogun calismamin arasinda boyle seylere "kafayi takiyorum" yas ilerleyince boyle takintilar oluyor, soz sizin verdiginiz orneklere bir daha cevap yazmam, ve sizide "haksiz" cikartmaya calismam. Istediginiz sekilde yazmaya devam edebilirsiniz.
Size verdigim rahatsizliktan dolayi ozur dilerim.
Haydaa neye niyet neye kısmet. Ne yazacağımı şaşırdım. Kusura bakmayın değerli zamanınızı boşa harcamanıza sebep oldum dedim, zahmet etmişsiniz dedim, teşekkür ederim dedim, size itiraz etmek gibi bir niyetim olamaz dedim ve hepsinde de samimiydim.
Neyse ben yatayım artık geç oldu.
Goto komutu pipe line mekanizmasını bozuyor bu yüzden kullanmayın diyenler için cevabım şu şekilde;
C kodlarınızda Goto komutu kullanmıyor olmanız üretilen hex kodda goto makine kodu kullanılmayacağı anlamına gelmiyor. Asıl amaç C satırlarında değil makine kodları arasında goto komutu kullanmamaktır ve bu da sizin elinizde değildir.
Hex kodlarında goto ya da türevi komut olmayan program parçası yazmak zaten imkansız. (Not: İstisnası var)
Eğer programda goto ile dallanmak yerine programda dallanılan kısımları parçalar her birini fonksiyon yaparım, böylece yeri geldikçe ilgili fonksiyon parçasını çağırırım diyorsanız burda yaptığınız Goto yerine Call komutu çağırmaktır ve Call komutu da Goto komutu gibi pipe line mekanizmasını sıfırlar. Bu durumda goto kullanmayın tavsiyesi hızla alakalı olamaz.
Bir takım organizasyonların almış olduğu kararlar çerçevesinde eğer yazdığınız program parçalarında organizasyonun kurallarına uymayan satırlar varsa bu durumda programınız geçer not alamayacağından ürününüzü satışa sunabilmek için gerekli belgeleri de alamayacaksınız demektir.
Bu durumda istenen kurallara uygun kod yazmak zorundasınız. Bu kurallar arasında "goto kullanmayın" kuralı varsa kullanmayacaksınız. Bunun sorgusu olamaz.
Ben bu tartışmaya katılırken böyle bir organizasyonla bağımızın olmadığını varsayıyorum.
Goto takip etmeyi zorlaştırıyor anlaşılırlığı bozuyor diyenlere ise cevabım şu şekilde;
Goto komutuyla karşılaşıldığında o an çalışmakta olduğunuz satırı terkedersiniz ve goto ile uçacağınız ilgili etiketten itibaren kodu işlemeye devam edersiniz.
Bu kafanızı karıştırıyor ve anlamanızı güçleştiriyorsa kusura bakmayın mal mısınız demek geliyor içimden.
Sırf goto kullanmamak adına while yada for döngülerinin başlığında yada içinde ilave kontrollar eklemek gene döngü çıkışı ardından ilave kontroller eklemek
programa ilave kodların girmesi ve programın yavaşlaması demek.
Onlarca yüzlerce MHz de koşan işlemci var bunlar da söylenecek laf mı diyebilirsiniz.
Programcılık 2'ye ayrılır.
1. tip programcılıkda kodlara eklenmiş ilave bir kaç yüz tane fazladan makine kodu konuşmaya bile değmez.
2. tip programcılıkta y=A*B + C*D işlemini
Y=A*B
Z=C*D
Y=Y+Z işlemi yerine
y=A*B + C*D işlemini doğrudan yapabilecek CPU komutlarına ihtiyaç duyulan programlardır.
2. tip programlama ile ilginiz olmadığı sürece hız derdiniz falan olamaz.
Not: CM3 işlemcilerde içi çok çok çok kısa olan while yada for döngülerini goto çevrimsiz yazmak mümkün fakat maalesef while ve for döngülerimiz her zaman kısa değildir.
Hiz vs hiç bir şey düşünmeden goto komutu kullanmayacağım diye bir şartım olmadan hiç bir optimizasyon kaygısı taşımadan işimi görsün mantığı ile yazdığım
Delphi kodlarımı yayınlayacağım.
İçinde bolca goto var. Sizlerden ricam bu program parçasını gotolardan arındırmamız olacak.
Delphi ve C syntax olarak benzer diller. O yüzden uğraşmamazlık etmeyin.
C deki { Delphi' de begin
C deki } Delphi'de end
fazladan do to gibi ekleri de zaten anlayacaksınız hatta yok var sayabilirsiniz.
En son yazımın üstüne yeni bir yazı gelmedi.
Acaba hem fikirmiyiz de gelmedi yoksa yazmak mı istemiyorsunuz?
Şurada akademik bir çalışma var (artık akademik örnek veriyorum yoksa kızıyorlar ;)
https://peerj.com/preprints/826v1.pdf
Özetin özeti:
50 yıl önce Dijkstra : "Hacı bu goto işi sakat gibi. Başımız ağrımasın sonra?".
Günümüzde bu makaleyi yazanlar: "Korkacak bir şey yok".
@z Hocam,
Yazılım konusunda en önemli şeyin algoritma olduğunu bugün olduğu gibi yaklaşık 20 senedir savunmaktayım.
Ortada yapılacak bir iş var.
Bu iş'in kodu; yeri gelir prototip amaçlı üstünkörü, yeri gelir sadece çalışsın sonucu versin, yeri gelir platformlar arası çevrim olarak, yeri gelir performanslı çalışacak şekilde optimize edilerek defalarca yazılabilir/güncellenebilir.
Dolayısıyla; yapılmış bir yazılımı iyi kodlanmış, kötü kodlanmış diye ayırmamalıyız. Aksi halde hepimizin yazdığı ilk kod kötüdür. Yani herkes kötü kod yazmıştır.
Eğer istenilen sonucu vermiyorsa hatalı kodlanmış diyebiliriz.
Performans gerektiren yerde yeterli performansı sağlamıyorsa yine optimize edilmesi gerek yorumunu yapabiliriz. vb..
Ben emimin ki; Siz ihtiyacınız olan kodlamaları yaparken yukarıda saydığım şekillerde yada o an hangisi gerekliyse o şekilde yapmışsınızdır zaten..
Alıntı YapSizlerden ricam bu program parçasını gotolardan arındırmamız olacak.
a) Benim yazdığım bu kodları goto'suz yapamazsınız, bunu görün istiyorum.
b) Goto'lu yada goto'suz yazdığınızda bir fark olmadığını size göstermek istiyorum.
c) Ben bu kodları yazdım ama optimize edilmesi gerekiyor, bunun için kodları inceleyip goto'lardan arındıracak vakti olan bir gönüllü arıyorum.
d) Yapında göreyim!
:)
Hangisi hocam.?
4 seçenek de de değil.
Goto ile anlaşılırlık bozuluyor deniyor ya onun için örneği vermek istiyordum.
Alıntı YapGoto ile anlaşılırlık bozuluyor
Yok Hocam olur mu öyle şey..
Yazılım pattern'leri, OOP vb.. bir çok yol, yordam, yöntem, editör vs var.. Yüz binlerce satır da yazsan arada kaybolmadan seyahat edebiliyoruz konforlu bir şekilde.
Sürçü lisan edilmiş diyelim..
Algoritma sağlıklı ve performanslı bir şekilde yerine getiriliyorsa, goto moto run diyip önümüze bakalım..
MISRA da goto kullanilmamasi advisory.
Aciklamasi su sekilde:
Unconstrained use of goto [b]can[/b] lead to programs that are [b]unstructured[/b] and[b] extremely difficult to
understand.[/b]
In some cases a total ban on goto requires the introduction of flags to ensure correct control flow,
and it is possible that these flags may themselves be less transparent than the goto they replace.
Therefore, if this rule is not followed, the restricted use of goto is allowed where that use follows the
guidance in Rule 15.2 and Rule 15.3.
Ama asagidaki kurallari uygulamazsaniz bir deviation record yazip onaylatmaniz gerekiyor.
The goto statement shall jump to a label declared later in the same
function
Any label referenced by a goto statement shall be declared in the same
block, or in any block enclosing the goto statement
Kisisel fikirlerim su sekilde:
@z goto kullanacak sekilde tasarimi yapilmis fonksiyon goto suz hale getirilirse okunaksiz/daha uzun hale gelir dogal olarak. Burada onemli olan kodlama değil tasarim.
Fonksiyonel diller kullanilirken goto ya gerek kalmayacak sekilde tasarimlar yapilir. Bazi istisnai durumlarda fayda saglasa da kullanimi tavsiye edilmez.
@z bu karmasikligi anlamayan kod yazmasin anlayisinin siniri yok bence. Baskasina bu sekilde makro kullanimi karmasik yapmaz, Baskasina gore apacik limitli rekursion un bir sakincasi yoktur. Kimisi function pointerda kafasi karisan zaten c yazmasin der. Bu isin sinirini nasil koyacagiz? Onemli olan hata riskini azaltmak.
200 satirlik fonksiyon ne kadar garipse, 20 satirlik kodda goto kullanmak ta bana gore o kadar garip. Tabi ben safety ve maintainability yonunden bakiyorum.
Birisi de cikar derki "fonksiyona bolmek bence yanlis performans acisindan" hakli derim. Ama bu uzun fonksiyon yazmayi dogru pratik yapmaz.
Eskilerde sık kullanılan özellikle döngülerde kullanılan değişkenleri register olarak tanımlanması tavsiye edilirmiş. Şimdi ise güncel derleyiciler bunları kendileri hallettiği için gerek yok deniyor. goto komutunda hiç mi ilerleme olmadı?
Okuduğum bir yazıda (Python ile ne yapamam gibi bir soruya cevap) şuna benzer şeyler vardı: Eskiden işlemci gücü çok pahalıydı, insan gücü görece daha ucuzdu. Bu yüzden insan gücünden harcayıp az işlemci gücüyle çok iş yapmaya çok vakit ayrılırdı. Şimdi işlemci gücü inanılmaz arttı, insan gücü ise oldukça pahalı. Kodu optimize etmek için mühendise para vereceğine gidip daha güçlü bir işlemci alabilirsin. Bu yüzden Python gibi diller oldukça popüler.
Bana sorarsanız goto kullanmayın demelerinin en büyük amacı şu: programlama o kadar yaygınlaştı ki program yazmak için uzman olmak gerekmiyor. Dikkat ederseniz goto komutu içeren sorular acemi kullanıcılardan çok geliyor ve onlara cevap olarak "goto kullanma, for vs. kullan" deniyor. Programlama öğrenen kişilerin çok azı düşük işlem gücüyle çok iş yapmaya çalışacak. Bu kişiler de zaten bu tavsiyenin verileceği dönemi geçmiş oluyor.
Benim programlama tecrübem yok, onun için goto konusunda bir fikrim yok. Ama şunu söyleyeyim: z hocam siz Assembly kullanan adamsınız size goto komutunun karmaşık gelme ihtimali yok zaten.
(http://i.hizliresim.com/gy2oGN.png) (http://hizliresim.com/gy2oGN)
Alıntı yapılan: z - 23 Ekim 2015, 13:00:38
(http://i.hizliresim.com/gy2oGN.png) (http://hizliresim.com/gy2oGN)
+1
:D Süper...
deveye sormuşlar "nişimi seversin, yokuşu mu" diye
deve cevap vermiş, "düz yol nerenize battı ?"
c gibi fonksiyonların çağrıldığı hiyerarşik bir dilde neden goto ya ihtiyacım olsun ?, çok lazımsa kullan.
aradığım bir kod vardı google amca bana bu sayfayı verdi... forumda bu konuda yorum yapanlara ayrı ayrı teşekkür ediyorum