C dili goto komutu

Başlatan Elektronikprojem, 16 Mart 2018, 16:14:34

Elektronikprojem

Herkese merhaba,
basic dilinden yavaş yavaş c diline geçmeye başladım. Serdar Çiçek hocamızın kitabını aldım sağolsun anlatımı çok iyi. Ama bir yerde takıldım kaldım. Kitapta goto deyimi için şöyle bir açıklamada bulunmuş."ancak yapısal programlama dillerinde bu tür dallanmalar pek tercih edilmez." Bu konuyu basic tarafından düşünüce program bu dallanmadan çıkabilir diye geliyor aklıma.Yani program topla goto topla etiketleri arasında dönerken basicdeki gibi if ile bu döngüden çıkılıp başka etikete dallanma yapılmaz mı.
Kısacası goto komutu neden kullanılmaz sakıncası nedir.

mg1980

Gerek yok ki..C dilinde fonksiyonlar var malümunuz.Bir fonksiyon genel olarak şu şekilde düzenleniyor:

void hesapla() {
......;
......;
}
Goto veya Gosub ihtiyacı duyduğunuz yere   "hesapla(); " yazdığınızda o anlamları karşılayarak gereken yapılmış oluyor.

a.zorba

fonksiyon olarak tanımlanır gider işlemini yapar gelir .
en basit anlatım ile .

int topla( int a, int b)
{
int c;   
c=a+b;
return c;
void main ()
{
topla(2,5);  // burayı başlangiçta goto gibi düşünebilirsin
}




mehmet

Main den çağrılan bir fonksiyona
gidilirken bazı anlık değerler stack
alanıma kaydedilip fonksiyon icra
edilir. Bu arada goto kullanılırsa
bu değerlerin yerleri kalır. Bir kaç
kere bu şekilde işlem yapılırsa stack
tasması oluşur ve Mcu kilitlenir.
Özellikle uzak işlemler de goto
kullanmak bu nedenle uygun olmaz.
C dilinde goto optimize edilmez. Direkt
asm komutu olarak icra edilir.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Elektronikprojem

#4
Cevaplariniz icin tesekkurler. Basic bildigimden dolayı hep c ile bagdastirmaya calisiyorum.

ete

Sonuçta derleyicilerin hepi aynı işi yapıyor ancak farklı yollardan gidiyorlar.
Her birinin uygulama mantığı daha doğrusu program oluşturma mantığı farklı.
Basic bilen birisinin basic de yazar gibi C de program yazması mümkün ama o zaman ne anlamı kalıyorki. C dilinin kendi formatı var ve ona uymak gerekir yoksa derleeyiciye basit bir programı uzun yollardan derletmiş olursunuz.
Kısaca şunu söylemeye çalışıyorum. C dilini öğreneceksen bir süreliğine Basic de ki yazım şeklini unutacaksın. Bir süreliğine diyorum çünki ben C dilini iyi bilip de basit işleri hatta orta zorluktaki programlarıda Basic de yazdıklarına pek çok kere şahit oldum sebebi basit ve pratikliği.  Ama C dilinin avantajlarınıda inkar etmemek gerekiyor. Komut zenginliği kısa kod oluşturması ve kütüphane lerden yararlanma kolaylığı ve bolca kütüphane olması bu dilin avantajları olarak sayılabilir.
Sonuçta goto yu unut. Onsuz yazmaya çalış programını. C dilinin en büyük avantajlarından birisi fonksiyon oluşturabilme kolaylığıdır. Basic de Gosub ile gidilen alt programları hatırlayın. Bunların hepsi birer fonksiyona bağlanıp C dilinde kullanılabiliyor.

Ete

İlyas KAYA

Sormayın hocam. Ccc s öğrendim bu yaştan sonra ama elim gitmiyor. Programları okuya biliyor yaza da biliyorum ama yok elim varmıyor:)
Şimdi "mikro basic" ogrenmeye çalışıyorum. Sanırım tam aradığım şey.  Basic dilinde fonksiyon ve kütüphane imkanı sunuyor.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Hattuşa

ETE hocam basicte macro oluşturmak C dilindeki fonksiyon oluşturma ile aynı gibi geldi bana. protonun kendi sitesindeki Les nickli kişi amicos adı altında macroları harika kullanıyor. bizse tam vakıf olamadık. zira türkiye de protonu tam bilen kimse yok.

ilyas hocam micro basicte derleyici ücretli olması bizim gibi amatörlerin önünü kesiyor.

aslında bizim sıkıntımız (basiccilerin) 1. kütüphaneler oluşturamayıp bu kütüphanelerin yaygınlaşamayışı 2. geniş MCU lara hükmedemeyişimiz gibi geliyor bana

mehmetOzdemir

konu sahibi arkadaşın da izniyle bir şey sormak istiyorum. ara ara c dilinde yazılan programları inceliyorum. bildiğiniz gibi basic'te değişkenleri programında başında tanımlar ve programın herhangi bir yerinde istediğimiz gibi kullanırız. yukarıda da verilen örneğe baktığımızda int ile belirtilen değişkenler fonksiyonda tanımlanıyor. bu değişkeni başka bir yerde kullanamıyoruz anlamına mı geliyor?

mg1980

Bildiğim kadarıyla global değişken denen değişkenler başta tanımlanıyor ve her yerde geçerli..Fonksiyon içinde tanımlanan yerel değişkenler ise o fonksiyon içinde geçerli.

Elektronikprojem

Evet okuduğumdan anladığım da o şekilde. programın başında belirtilen tüm program içinde geçerli.(doğru anladıysam tabiki, ustalar daha iyi bilir :))

Burak

Konu ilgimi çekti :) ... Hem bişiler yaziym hemde arkadaşın sorusuna cevap veriym ..


Öncelikle GOTO bir deyimdir .. Bu çok global ve her programlama dilinde mevcut olan bir deyimdir . Cevaplarda stack ifadesi kullanılmış hem onuda bi açalım .. Stack yığın anlamına gelen bir kelimedir ve şöyle örnekleyelim.. Bir çöp kamyonu var ve akşama kadar 3 çöp tenekesini boşaltıp geri dönüşüm merkezine geri gidiyor ve kendi çöp deposunu oraya boşaltıyor . . Hergün aynı işi yapıyor .. Ama birgün çöp tenekelerini boşaltıp geri dönüşüm merkezine gitmezse problem olmaz , Çöpler kamyonun içinde kalır .. İkinci gün yine tenekeleri boşaltıp geri dönüşüm merkezine gitmezse yine bi problem olmayabilir .. Ama daha sonraki günlerde artık çöp kamyonunun kendi deposuda dolu olacağı için daha fazla çöp alamayacaktır .. Dolayısıyla görevini yerine getiremez hale gelecektir .. Burada ki önemli mevzu bir işi yapıp geri dönmemiz gereken yere geri dönmek ve kaldığımız yerden devam edebilmektir .. GOTO bu noktada çöp tenekelerini boşaltmaya gönderilen çöp kamyonuna görevi sırasında başka bir iş emretmeye benziyor , ve bu yeni görev sebebiyle asıl görevin dışına çıkılmış olunuyor ve dönmesi gereken yere de dönemiyor ... Tabii bu durum birden fazla olunca yukarıdaki örnekte bahsettiğimiz sorunlar ortaya çıkmaya başlıyor .. Şimdi gelelim işin Basic ve C kısmına ..
Basic'te goto deyimini bir alt programda yani gosub ile gidilen yerin içerisinde iken kullanmak sorun yaratmaz .. Çünkü basic programlarında alt programlar dışında hariç program ana döngüde çalışır .. Hatta ilginç olan bir diğer şey ise alt programlar ana programın içinde tanımlanır biz onları sadece etiketler ve return satırları ile ayırırız .

C'de bu durum biraz daha derli toplu çalışır .. Her fonksiyon parantezlerle başlar parantezlerle biter , ana fonksiyon ile diğer fonksiyonlar iç içe değildir , ve hatta öyle olmadığı gibi , değişkenlerini bile paylaşmazlar .. Paylaşmak istedikleri değişkenleri global olarak tanımlayıp (fonksiyonların gövdelerinin dışında ve genellikle programın en yukarısında), paylaşmak istemediklerini ise fonksiyonların içinde tanımlarlar .. Hatta bu durumdan dolayı aynı 'x' harfini hem global hemde yerel olarak ama farklı çalışma noktalarında kullanmak üzere tanımlayabilirsiniz .. Bu durum RAM kullanımı konusunda işlemciyi de şişirmemiş olur .. Tabii pointer aritmetiği sayesinde de hem yerel hemde global değişkenler birbirileri ile değiş tokuş yapabilirler .. ki pointer zaten başlı başına C'nin en güzel yanıdır , ama aynı zamanda en fena yanıdır .. Çünkü syntax yani dilin grameri biraz ağırdır .. Noktalama işaretlerinden okunmaz hale gelebilir .. O yüzden C kafa yorar , sanki biraz genç işi gibi gelir ama , alışıncada herkese bildiği iş kolay gelir her zaman .. Bu forumda hepimiz Basic üzerinde yoğrulduk , geliştik ama birgün geldi canımız güçlü ve 32 bitlik işlemcilerle çalışmak istedi , DSPic yada PIC24-32 işlemcileri C gereksinimini doğurdu .. Sonra da bazılarımız dedi ki madem DSPic'lerin yada PIC24-32'lerin karmaşık yapıları ile uğraşacağım , birde ARM Cortex'lere yönleneyim , derken C öğrenip gitti .. Çünkü Basic desteği 16-32 bitlik denetleyiciler için en kötü ihtimalle MikroBasic'e kaldı .. Yada ProtonBasic'e diyelim .. (Ama forumlardan okuduğum kadarıyla optimizasyon konularında bu iki dil hala BUG açısından ciddi problemlerle boğuşuyormuş ..)

Sonuç olarak .. C elbette Basic'ten üstün ama , C'de program yazmak zorunda kalmıyorsanız Basic'in syntax kolaylığı elbette cezbedici ..

Burak
Ω Gens Una Sumus Ω

İlyas KAYA

Alıntı yapılan: pro-TR - 17 Mart 2018, 11:23:38
ETE hocam basicte macro oluşturmak C dilindeki fonksiyon oluşturma ile aynı gibi geldi bana. protonun kendi sitesindeki Les nickli kişi amicos adı altında macroları harika kullanıyor. bizse tam vakıf olamadık. zira türkiye de protonu tam bilen kimse yok.

ilyas hocam micro basicte derleyici ücretli olması bizim gibi amatörlerin önünü kesiyor.

aslında bizim sıkıntımız (basiccilerin) 1. kütüphaneler oluşturamayıp bu kütüphanelerin yaygınlaşamayışı 2. geniş MCU lara hükmedemeyişimiz gibi geliyor bana

Her derde deva bir kürek illaki var :)
Normalde pic Basic 'de ücretlidir.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

MC_Skywalker

Alıntı yapılan: İlyas KAYA - 17 Mart 2018, 17:53:35
Her derde deva bir kürek illaki var :)
Normalde pic Basic 'de ücretlidir.

C/C++ için kazma kürek gerekmeyen sürümlerde mevcuttur.

İlyas KAYA

Alıntı yapılan: MC_Skywalker - 17 Mart 2018, 20:03:02
C/C++ için kazma kürek gerekmeyen sürümlerde mevcuttur.

Noktalı virgül süslü parantez , if yapısında ve for yapısında saçma bir yazım şekli olmayanı var mı? :D
Mesela nextion editörün kullandığı c dili çok güzel. Picbasic gibi yazılıyor C gibi okunuyor :)
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Powered by EzPortal