C yuksek duzeyli diller icinde en hizlisi deniyor. Peki hic dusundunuz mu C nin hizi ve avantaji nereden gelmektedir?
Basic dili C ile kapisabilirmi?
Tartisma baslatmak uzere bir kac ornek vermek istiyorum. (Evet istenirse Basic ile C kapisabilir.)
A=B+C islemi Basicde A=A+B: C de ise A=A+B; seklinde yazilir.
Basicde for dongusu for a=0 to 9 C de ise for (a=0; a<10; i++) seklinde yaziliyor
C nin for dongusunun Basicdeki gibi tek duze olmayisi elbette avantajlidir. (Fakat C nin esnek for komutunun cok benzeri istenirse Basic komut setine de eklenebilir.)
y=Sin(x+z*w) islemi basicde y=sin(x+z*w) : C de ise y=sin(x+z*w); seklide yazilir.
Eger isterseniz ara degiskenlerle a=z*v: a=x+a: y=Sin(a) islemi yaparak kod isletim suresini uzatabilirsiniz.
Gorulecegi uzere temel fonksiyonlarda ciddi hic bir fark yok.
Fark, bu islemlere karsi gelen makine kodlarinin olusturulusunda. C nin hizli kosamasinin sebebi, makine kodlarinin sade olusudur.
(Bir kadinin arabadan inip bankamatikten kart ile para cekip geri arabasina binip gitmesi ile ilgili anlatim bir zamanlar maillerle ordan oraya dolasiyordu. Basicdeki kod isletimi bu anlatima cok benzer.)
Bir de pointer islemlerine bakalim.
Ornegin
16 bitlik integer verilere ulasan bir pointerimiz olsun.
Basic de pointer ile verilere ulasmaya kalksaydik
Ornegin Adr komutu ile basic de adres alabilelim.
Bu durumda 10 adet integer verilere ulasirken
P=Adr(Var1);
for i=0 to 9
oku=Peek(P)
P=P+2
next i seklinde yazilabilir.
C de ise
P=&Var1
for (i=0; i<10; i++)
{
oku:=*P
P++;
}
seklinde olacaktir.
mukayese edersek basicdeki yuksek duzeyli ve yavas sayilabilecek P = P + 2 islemine karsilik C nin P++ avantaji vardir.
Eger istenirse sadece syntax degistirilmek uzere C derleyici uzerinde yapilacak modifikasyonla C derleyicisi Basic derleyicine donusturulebilir.
Bu durumda birisi Basic digeri C olan fakat hizlari ve kod karmasasi ayni iki dil karsimiza cikar.
Peki budurumda nerede kaldi C nin Basicden daha hizli oldugu?
Herhangi bir dil derleyicisi adam gibi yazilirsa C mis Basicmis farketmez.
Fakat ne yapilirsa yapilsin hic biri asm kadar basina buyruk yapilamaz.
Alıntı yapılan: bunalmis - 07 Haziran 2011, 05:35:41
C yuksek duzeyli diller icinde en hizlisi deniyor. Peki hic dusundunuz mu C nin hizi ve avantaji nereden gelmektedir?
Basic dili C ile kapisabilirmi?
Tartisma baslatmak uzere bir kac ornek vermek istiyorum. (Evet istenirse Basic ile C kapisabilir.)
A=B+C islemi Basicde A=A+B: C de ise A=A+B; seklinde yazilir.
Basicde for dongusu for a=0 to 9 C de ise for (a=0; a<10; i++) seklinde yaziliyor
C nin for dongusunun Basicdeki gibi tek duze olmayisi elbette avantajlidir. (Fakat C nin esnek for komutunun cok benzeri istenirse Basic komut setine de eklenebilir.)
y=Sin(x+z*w) islemi basicde y=sin(x+z*w) : C de ise y=sin(x+z*w); seklide yazilir.
Eger isterseniz ara degiskenlerle a=z*v: a=x+a: y=Sin(a) islemi yaparak kod isletim suresini uzatabilirsiniz.
Gorulecegi uzere temel fonksiyonlarda ciddi hic bir fark yok.
Fark, bu islemlere karsi gelen makine kodlarinin olusturulusunda. C nin hizli kosamasinin sebebi, makine kodlarinin sade olusudur.
(Bir kadinin arabadan inip bankamatikten kart ile para cekip geri arabasina binip gitmesi ile ilgili anlatim bir zamanlar maillerle ordan oraya dolasiyordu. Basicdeki kod isletimi bu anlatima cok benzer.)
Bir de pointer islemlerine bakalim.
Ornegin
16 bitlik integer verilere ulasan bir pointerimiz olsun.
Basic de pointer ile verilere ulasmaya kalksaydik
Ornegin Adr komutu ile basic de adres alabilelim.
Bu durumda 10 adet integer verilere ulasirken
P=Adr(Var1);
for i=0 to 9
oku=Peek(P)
P=P+2
next i seklinde yazilabilir.
C de ise
P=&Var1
for (i=0; i<10; i++)
{
oku:=*P
P++;
}
seklinde olacaktir.
mukayese edersek basicdeki yuksek duzeyli ve yavas sayilabilecek P = P + 2 islemine karsilik C nin P++ avantaji vardir.
Eger istenirse sadece syntax degistirilmek uzere C derleyici uzerinde yapilacak modifikasyonla C derleyicisi Basic derleyicine donusturulebilir.
Bu durumda birisi Basic digeri C olan fakat hizlari ve kod karmasasi ayni iki dil karsimiza cikar.
Peki budurumda nerede kaldi C nin Basicden daha hizli oldugu?
Herhangi bir dil derleyicisi adam gibi yazilirsa C mis Basicmis farketmez.
Fakat ne yapilirsa yapilsin hic biri asm kadar basina buyruk yapilamaz.
Merhaba,
4 işlem uygulamalarıyla diller karşılaştırılmaz, önce C'nin derin kısımlarını araştırırsan(embedded düzeyde ) örneğin structer, structer pointer, structer array, linked list, union ve bunların kombinasyonları gibi ve C'de bu karmaşık yapının assembly'li çözümüne, ozaman aradığın farkı bulacaksın.
Asm hızlı evet ama o durumda biz yavaşız değil mi? Tercih meselesi tabii, keil, iar, hitech gibi profesyonel derleyici kullanıyorsan genellikle ASM mi C mi demene gerek kalmaz.
Ama kısmen sana hak veriyorum, C içindeki for, while, if vs gibi "temel" kavramları hangi derleyici ile yazarsan yaz benzer sonuçlar üretebilir. Ama yukarıda yazdığım gibi program yazmayı çok kolaylaştıran yapılar var ve profesyonel C derleyicileri bu yapılar için asm'ye çok yakın değerler üretiyorlar ve bunu asm'de yazmaya kalksak günleri alır ve denenmemiş oluyor (bug çıkması muhtemel).
Biraz olaya ilgisiz taraftan bakmışsınız.
Yazıma dikkat etseniz karşılaştırmamın, karmaşık komutların olup olmaması değil de hızlı kod koşturma ve sade makine kodu üretme odaklı olacağını görecesiniz.
4 matematiksel işlemden biri olan bölme bile, iki dilin hız açısından karşılaştırılması açısından fazlasıyla yeterlidir. Özellikle de işlemcinin bit uzunluğunun bir kaç katı uzunlukta bölme işlemi hız karşılaştırması açısından ideal bir test programıdır.
Çarpma, bölme, toplama ve çıkarma esasına dayanan trigonometrik fonksiyonlarla yapılacak hız karşılaştırmasında, C Basic sonuçları bariz farklılıklar gösterir.
Fakat bu, C nin gücünden değil, Basic derleyiciyi yazanların beceriksizliğinden kaynaklanır.
Alıntı yapılan: bunalmis - 07 Haziran 2011, 11:23:52
Biraz olaya ilgisiz taraftan bakmışsınız.
Yazıma dikkat etseniz karşılaştırmamın, karmaşık komutların olup olmaması değil de hızlı kod koşturma ve sade makine kodu üretme odaklı olacağını görecesiniz.
4 matematiksel işlemden biri olan bölme bile, iki dilin hız açısından karşılaştırılması açısından fazlasıyla yeterlidir. Özellikle de işlemcinin bit uzunluğunun bir kaç katı uzunlukta bölme işlemi hız karşılaştırması açısından ideal bir test programıdır.
Çarpma, bölme, toplama ve çıkarma esasına dayanan trigonometrik fonksiyonlarla yapılacak hız karşılaştırmasında, C Basic sonuçları bariz farklılıklar gösterir.
Fakat bu, C nin gücünden değil, Basic derleyiciyi yazanların beceriksizliğinden kaynaklanır.
Merhaba,
Bende sizin bahsettiğiniz gibi hızdan bahsediyorum, o yapıları basicte kurun ve sonra hız karşılaştırması yapın. Hem işlemci çalışma hızı hemde kullanıcı program yazma hızını birlikte test edebilirsiniz. Dört işlemlerde ki hız karşılaştırmaları ise derleyiciye göre değişir, dile göre değil. Mesela atıyorum X basic programı keil'in kullandığı bölme algoritmasını kullanıyorsa, derleme sonucu oluşan kod yaklaşık aynı çıkacaktır.
Basic ve C aynı 4 math algoritmasını kullanansa bile trigonometrik hesaplamalarda C nin daha hızlı olacağını söyleyebilrim.
Bu hız farkı, C derleyicilerin çok az geçici register kullanarak fonksiyonlar arası veri transferinde zaman kaybını azaltacak kodlar üretmesinden kaynaklanır. (Bakınız bankamatikten para çeken kadın olayına)
İşte başından beri gelmek istediğim nokta da burası.
Basic derleyici C ye benzer şekilde bu manüplasyonları yaparsa özellikle de basic makinası gibi yapıdan uzaklaşırsa iki dilin birbirinden tek farkı,
nerede ise komut dizilimlerin birinde ; diğerinin ise : ile sonlanması kadar küçük olacaktır.
Eğer structer yapıları gibi yapılardan dolayı C güçlüdür derseniz buna katılırım. Fakat bu kısım şu anki tartışmada bizi hiç ilgilendirmiyor.
Örneğin tartışmayı 16F serisi işlemcilere kod üreten C ve Basic derleyici olarak ele alırsak zaten bunlar C derleyiciler için bile havada kalır.
Bu tip basit işlemcilere kod üreten C derleyicinin stacktaki manüplasyon şansı elinden alındığı halde Basic derleyicilerden açık ara hızlı çalışan kod üretir. Bu dediğiniz gibi dilin değil de derleyicinin başarısı.
Demek istediğim gelmek istediğim konu da burası. C derleyicisi yazan ekip iyi bir Basic derleyicisi de yazmış olsalar Bizlerin C iyidir Basic yavaştır tartışması yapmasına bile gerek kalmaz.
Elektronikçilerin büyük veri öbekleri üzerinde işlem yapacak programlar yazmaları, structure, array, link list uygulamalarına bulaşmalarını biraz meslekten uzaklaşma olarak görüyorum. (Bırakın bu işleri elektronik eğitimi almış olanlar değil de bilgisayar eğitimi almış olanlar yapsın.)
Dolayısı ile C nin bu tip uygulamalar için gereken pointer, structure vs işlemlerini tıraşlayalım ve Basice denk gelen halini tartışalım.
Bunalmış hocam.
Burada dilden değil de derleyiciden bahsetmek gerek sizinde söylediğiniz gibi. iyi bir Basic derleyicisi iyi bir kod üretir. bunun dille pek alakası yoktur.(dilden kasıt syntax) bazı örnekler verebilirim.
Gömülü sistem için (18F) üretilmiş bir Swordfish compiler var. adamlar oldukça iddalılar. CCS (eğer C olarak kabul edersek) den daha optime kod ürettiğini söylüyorlar.Bknz http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.Comparison (http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.Comparison)
Geçelim Pc boyutuna
daha önceden VBasic de(6.0)
A=a+1 yazardık
artık
A+=1
yazabiliyoruz. ama bu demek değildirki C# kadar (neredeyse sondaki noktalı virgül eksik) optimize edilnmis kodlar üretsin.
Benim öngörüm yakın tarihte dil kavramı kalmayacak. Bknz Flowcode http://www.matrixmultimedia.com/flowcode.php (http://www.matrixmultimedia.com/flowcode.php)
Alıntı yapılan: bunalmis - 07 Haziran 2011, 13:08:11
Basic ve C aynı 4 math algoritmasını kullanansa bile trigonometrik hesaplamalarda C nin daha hızlı olacağını söyleyebilrim.
Aynı matematik algoritmasını kullanılarsa çok fark olmaz. Zaten yazınızın ilerleyen kısımlarında sizde aynısını söylüyorsunuz.
Alıntı yapılan: bunalmis - 07 Haziran 2011, 13:08:11
Elektronikçilerin büyük veri öbekleri üzerinde işlem yapacak programlar yazmaları, structure, array, link list uygulamalarına bulaşmalarını biraz meslekten uzaklaşma olarak görüyorum. (Bırakın bu işleri elektronik eğitimi almış olanlar değil de bilgisayar eğitimi almış olanlar yapsın.)
Kesinlikle katılmıyorum, derleyicinin asm olarak arkada ne yaptınığı biliyorsan işini kolaylaştıran herşeyi kullanman avantajınadır. Özellikle büyük projelerde bir gereksinimdir. Mesela bende illa asm olsun diyen elektronikçilerin gelişime kapalı olduklarını düşünüyorum, hep yerlerinde sayarlar, ilerleme kaydedemezler. Millet koptu gidiyor, 1MB flash hafızalı işlemciler var, mükemmel kod optimizasyonu yapan derleyiciler var,
işlemci donanımları bile C'de program yazmaya uygun, siz hala illa asm olsun, C derleyicilerinden daha çok kod optimazyona çalışmak gibi gereksiz işlerle uğraşıyorsunuz.
Aslında mantık basit, 100 satır bir program yazacağıma aynı işlemi 10 satırda yazarım biter. Burada C dilinin ve profesyonel derleyicinin gücünü kullanırım.
Alıntı yapılan: bunalmis - 07 Haziran 2011, 13:08:11
Dolayısı ile C nin bu tip uygulamalar için gereken pointer, structure vs işlemlerini tıraşlayalım ve Basice denk gelen halini tartışalım.
Zaten C'nin temel yapı taşı olan pointer, structer, union'ları çıkarırsan C'de basic olur.
Swordfish i inceleyiniz. Dedikleriniz mevcut Ozaman Basic, C mi oluyor ?
Alıntı yapılan: muhittin_kaplan - 07 Haziran 2011, 14:44:04
Swordfish i inceleyiniz. Dedikleriniz mevcut Ozaman Basic, C mi oluyor ?
Hayır basic, C olmuyor, bu programa " basic++" denir, C'de ansi c denilen bir kavram vardır ansi c yapısına uygun tüm C derleyicileri hepsini birbirinde derleyebilirsin. Bu swordfish'i başka basic derleyicilerde derleyebilirsen o zaman dediğin olur.
Alıntı yapılan: eemkutay - 07 Haziran 2011, 14:39:30
Alıntı yapılan: bunalmis - 07 Haziran 2011, 13:08:11
Basic ve C aynı 4 math algoritmasını kullanansa bile trigonometrik hesaplamalarda C nin daha hızlı olacağını söyleyebilrim.
Aynı matematik algoritmasını kullanılarsa çok fark olmaz. Zaten yazınızın ilerleyen kısımlarında sizde aynısını söylüyorsunuz.
Alıntı yapılan: bunalmis - 07 Haziran 2011, 13:08:11
Elektronikçilerin büyük veri öbekleri üzerinde işlem yapacak programlar yazmaları, structure, array, link list uygulamalarına bulaşmalarını biraz meslekten uzaklaşma olarak görüyorum. (Bırakın bu işleri elektronik eğitimi almış olanlar değil de bilgisayar eğitimi almış olanlar yapsın.)
Kesinlikle katılmıyorum, derleyicinin asm olarak arkada ne yaptınığı biliyorsan işini kolaylaştıran herşeyi kullanman avantajınadır. Özellikle büyük projelerde bir gereksinimdir. Mesela bende illa asm olsun diyen elektronikçilerin gelişime kapalı olduklarını düşünüyorum, hep yerlerinde sayarlar, ilerleme kaydedemezler. Millet koptu gidiyor, 1MB flash hafızalı işlemciler var, mükemmel kod optimizasyonu yapan derleyiciler var,
işlemci donanımları bile C'de program yazmaya uygun, siz hala illa asm olsun, C derleyicilerinden daha çok kod optimazyona çalışmak gibi gereksiz işlerle uğraşıyorsunuz.
Aslında mantık basit, 100 satır bir program yazacağıma aynı işlemi 10 satırda yazarım biter. Burada C dilinin ve profesyonel derleyicinin gücünü kullanırım.
Alıntı yapılan: bunalmis - 07 Haziran 2011, 13:08:11
Dolayısı ile C nin bu tip uygulamalar için gereken pointer, structure vs işlemlerini tıraşlayalım ve Basice denk gelen halini tartışalım.
Zaten C'nin temel yapı taşı olan pointer, structer, union'ları çıkarırsan C'de basic olur.
Bu durumda küçük projeler için C diye tutturmanın anlamı yok değilmi?
Proje Basicle 50 satırda bitiyorsa Basici dayayıp geçmek lazım.
Proje küçük olunca Basic ile yazmanın avantajı nedir ?
Basic'in avantajı nedir? Tamam söyleyeceğim fakat önce sen söyle. C nin dezavantajı nedir?
C'nin dezavantajı olarak <küçük projelerde> Orta seviyeli olmasından kaynaklanan,
daha fazla kod yazma ihtiyacı olabilir. Bu da küçük projelerde anlamlı bi dezavantaj olabilir.
Basic pek kullanmadım, gördüğüm kadarı ile yüksek seviyeli bir dil,
Basit projeyi hızlıca bitirmek için az sayıda kodla bile birşeyler yapılabiliyor...
Mcu donanımı bazında olanlarla ilgilenmek yerine direkt hedefe odaklanılabiliyor.
tabi bu avantaj mı sağlıyor ? bence hayır,
Çünkü Multitasking yapabilecek kadar tecrubeye sahip olmadıktan sonra Basic in
sağladığı yüksek seviyeli fonksiyon ve komut serisi ancak küçük bir mutluluk sağlayabilir.
Kısa olmayan süredir C kodu yazanlar da birçok şeyi <genellikle> pratikleştirmiş oluyor.
Kendi değerlendirmeme göre C nin tek dezavantajı var. Öğreninceye kadar zor bir dil.
Basic ise okunduğunda sanki ingilizce konuşuluyormuş gibi kelime dizilişine sahip. Çok küçük yaştakiler bile kolayca öğrenebiliyor.
Bence Basic'in en büyük avantajı bu.
Bu arada Multitasking illa C için yapılır diye bir şey yok.
Multitasking BASIC ile yapılamaz demedim ki,
Bunu yapıncaya kadar dedim...
Tekrar dan sorma gereği duydum. Derleyicimi yoksa dilmi tartışıyoruz ?
benim bildiğim basic seviyesi seviyeden sayılmaz ama çok çabuk öğrendim başlangıcı okadar basit ki hemen üstüne birşeyler ekleyerek geliştiriyorsunuz kendinizi çok rahat çift satır 7segment pid ısıkontrol rölesi tasarlayabilirsiniz
ama c de bunu başaramadım bazı ezberleri var galiba void main nedir olsa ne olur olmasa nolur hala anlamış değilim yukarda bahsedilen basicteki for döngüsü ile cdeki döngünün ifade şekli farkı anlatır sanırım
basic bana basit kelimesini çağrıştırıyor.
aslında temel dil basic olup c de olan ek-komplike komutlarıda içeren ve istenildiğinde her noktaya asm gibi inebileceğimiz bir dil geliştirilse keşke ve derleyicisie çok stabil kodlar üretse
üstat benim bildiğim proton asmyede iner çok profsyonel olmaya gerek yok c ile nal toplamaniz işten bile değil önemli olan iin tozunu yutmak
Alıntı yapılan: bunalmis - 07 Haziran 2011, 17:07:57
Alıntı yapılan: eemkutay - 07 Haziran 2011, 14:39:30
Alıntı yapılan: bunalmis - 07 Haziran 2011, 13:08:11
Basic ve C aynı 4 math algoritmasını kullanansa bile trigonometrik hesaplamalarda C nin daha hızlı olacağını söyleyebilrim.
Aynı matematik algoritmasını kullanılarsa çok fark olmaz. Zaten yazınızın ilerleyen kısımlarında sizde aynısını söylüyorsunuz.
Alıntı yapılan: bunalmis - 07 Haziran 2011, 13:08:11
Elektronikçilerin büyük veri öbekleri üzerinde işlem yapacak programlar yazmaları, structure, array, link list uygulamalarına bulaşmalarını biraz meslekten uzaklaşma olarak görüyorum. (Bırakın bu işleri elektronik eğitimi almış olanlar değil de bilgisayar eğitimi almış olanlar yapsın.)
Kesinlikle katılmıyorum, derleyicinin asm olarak arkada ne yaptınığı biliyorsan işini kolaylaştıran herşeyi kullanman avantajınadır. Özellikle büyük projelerde bir gereksinimdir. Mesela bende illa asm olsun diyen elektronikçilerin gelişime kapalı olduklarını düşünüyorum, hep yerlerinde sayarlar, ilerleme kaydedemezler. Millet koptu gidiyor, 1MB flash hafızalı işlemciler var, mükemmel kod optimizasyonu yapan derleyiciler var,
işlemci donanımları bile C'de program yazmaya uygun, siz hala illa asm olsun, C derleyicilerinden daha çok kod optimazyona çalışmak gibi gereksiz işlerle uğraşıyorsunuz.
Aslında mantık basit, 100 satır bir program yazacağıma aynı işlemi 10 satırda yazarım biter. Burada C dilinin ve profesyonel derleyicinin gücünü kullanırım.
Alıntı yapılan: bunalmis - 07 Haziran 2011, 13:08:11
Dolayısı ile C nin bu tip uygulamalar için gereken pointer, structure vs işlemlerini tıraşlayalım ve Basice denk gelen halini tartışalım.
Zaten C'nin temel yapı taşı olan pointer, structer, union'ları çıkarırsan C'de basic olur.
Bu durumda küçük projeler için C diye tutturmanın anlamı yok değilmi?
Proje Basicle 50 satırda bitiyorsa Basici dayayıp geçmek lazım.
Merhaba,
Benim anlatmak istediğim programı kısa yoldan yazalım gitsin anlamında değil ne demek istediğimi anladın aslında ama asm'den uzaklaşmayı kolaycılık görüyorsun. İsteyen istediği dili veya derleyiciyi kullansın ama bana göre basic , "swordfish gibi standart dışı diller" ("basic++" veya "modifiyeli basic" veya "C benzeşimli basic"'te diyebiliriz) veya ansi C programlama formatı dışında kendi programlama formatlarını kullanan derleyiciler bile aşağıdaki şartları sağlamaz. C'den daha iyisi var, oda C++'dır ama onuda büyük ve karmaşık projelerde keil, iar gibi profesyonel derleyicilerde kullanmak daha matıklı olur, yoksa küçük ve orta büyüklükteki projelerde aşağıdaki şartlardan bazılarını sağlamaz.
1) program yazma hızı : C ile akıcı şekilde program yazılabilir
2) program işletim hızı : çok küçük projeler olmadıktan sonra en iyisi C, çok küçük projeler için asm en iyisi
3) verimlilik : pointer, structer vs. özellikler sayesinde en kısa zamanda en verimli kodu yazabilirsin
4) okunabilirlik : C'nin block yapı şeklinde olmasından dolayı okunabilirliği kolaydır
5) taşınabilirlik : yazdığın programı şimdiki ve gelecekte çıkacak tüm işlemcilerde kullanabilme
6) modülerlik : Eskiden yazdığın bir program parçasını veya fonksiyonunu yeni projelerine dahil etme
Asm den uzaklasmak mi?
Alıntı YapZaten C'nin temel yapı taşı olan pointer, structer, union'ları çıkarırsan C'de basic olur.
Bunu dedigin icin zaten basindan beri bunu savundugum icin kucuk projelerde BASIC i dayayalim gitsin demistim.
Basic ile C nin tek farki programin goruntusunun deseni ve daha onemlisi parametre aktariminda birinin tercihen stacki digerinin ise global alani kullanmasi.
Simdi C bilenler yazdiklarima anlam veremiyor olabilir. Ben ise C bilmeyenlerin tarafindan olaya bakiyorum.
C bilen birinin Basic ile isi ne tabiki...
Kusuruma bakmayın, konuyu biraz alakasız görünecek şekilde blüyorum ama;
Alıntı yapılan: bunalmis - 08 Haziran 2011, 10:24:20
...
Simdi C bilenler yazdiklarima anlam veremiyor olabilir. Ben ise C bilmeyenlerin tarafindan olaya bakiyorum.
C bilen birinin Basic ile isi ne tabiki...
Üstadım bu ifadenizden sonra; herkes için MCU tabanında kullanılabilecek makale/ders serisi, sanıyorum ki sektör adına, bu ülke için en büyük iyilik olacaktır. C öğreniyorum diyebilecek seviyedeyim ve tecrübelerin/püf noktalarının inanılmaz faydası olacağından eminim. C nin üstadları böyle bir çalışma yapmayı düşünmez mi acaba? Sıfırdan başlayarak böyle bir seri sanıyorum yıllar boyunca hayır duası sağlar.
C ustadları varken bana söz düşmez. Fakat bir dil bilip te C öğrenmekte zorlananların halini benden iyisi bilemez.
Uzun zaman önce, programlarımı, sadece bildiğim iki dil olan asm ve Basic ile yürütürken C öğrenmek istememe rağmen C yapısı zor gelmiş kendi kendime de öğrenme yolunu seçmemeyerek her defasında ertelemiştim.
Taaaki bir arkadaşımla sohbet edip bana 10 dakikalık küçük kurs vermesi ve ardından da sorularımı cevaplayana dek.
Eger Basic biliyor ve C' ye geçmeyi düşünüyorsanız size seve seve çok küçük bir kurs (yazı) düzenleyebilirim.
Yeterki Basic bilin. Derdiniz C olsun. Eğer Basic de bilmiyorsanız yazacağım yazı, Basicle mukayese temelli olacağından işinize yaramaz.
O halde hemen başlayayım....
Konuyu baslatma amacim bu degildi ama Katana'yi kirmayayim.
Şimdi Basic le mukayese edeceğim de hangi Basic ile sorusu muamma. Bir Basic'deki yapı bir diğer Basic'dekine uymayabilir.
Genede Basic Basic'dir Benim Basic kurallarimla ilgili yazacaklarıma itiraz etmeden kabul ederseniz dallanmaya gerek kalmaz.
Basic de programımız, ilk satırdan itibaren işletilir.
C de programımız void main(void) benzeri kisacasi main yazan bolgeden itibaren.
Soyle de dusunebilirsiniz.
Basicde Main satiri 1. satirdir.
Eger kodlarimiz 1. satirdan itibaren degil de etiketi Basla olan satirdan itibaren baslasin istersek
ilk satira goto Basla yazariz.
C de boyle bir seye gerek yok.
void main(void)
{
}
gibi bir satiri programin neresine yazarsaniz yazin Programin baslayacagi yer
iste bu main olan satirin oldugu bolgedir. Bolgedir dedim satir demedim. Neden satir demiyorum sonra anlayacaksiniz.
Basic de Komut sonlarini : ile sonlandiririz.
C de komut sonlarini ; ile sonlandiririz.
Basicde ayni satira birden fazla kod yazmayacaksak en saga: koymak zorunda degiliz.
C de her komutun sonuna ; koymak zorundayiz.
Ornegin
Basic de A=A+1: B=B+1 Burada A=A+1 sonunda : sart, fakat B=B+1 sonunda : sart degil
C de a=a+1; b=b+1; Burada ; kullanmak sart
C de isimlendirmelerde kucuk harf tercih edilir. Basic de ise genellikle buyuk harf.
Fakat bu sadece bir tercih, zorunluluk degil.
Basicde herhangi bir satirin isletilmesini istemiyorsak satirin basina REM yada ' yazariz.
C herhangi bir satirin isletilmesini istemiyorsak satirin basina // yazariz.
Alt alta 3 satiri iptal edelim.
REM Basicde burasi iptal edilen 1.satir
REM Basicde burasi iptal edilen 2.satir
REM Basicde burasi iptal edilen 3.satir
// C de burasi iptal edilen 1.satir
// C de burasi iptal edilen 2.satir
// C de burasi iptal edilen 3.satir
Asagida C nin bir kolayligi var. /* ve */ arasinda ne var ne yok hepsi iptal olunur.
/*
C de burasi iptal edilen 1.satir
C de burasi iptal edilen 2.satir
C de burasi iptal edilen 3.satir
*/
Simdilik bukadar. Bu yazi gibi en fazla 3 yazi daha yazarsam tum BASIC kullanicilari artik C ile yazmaya baslayabilir.
hocam duaları almaya başladınız sağ taraftaki yazıcınızın sevap sayıcısı=c ise c=c+1
Alıntı yapılan: bunalmis - 08 Haziran 2011, 13:57:00
Simdilik bukadar. Bu yazi gibi en fazla 3 yazi daha yazarsam tum BASIC kullanicilari artik C ile yazmaya baslayabilir.
hocam dört göz ile bekliyorum.
Alıntı yapılan: katana - 08 Haziran 2011, 12:47:30
Kusuruma bakmayın, konuyu biraz alakasız görünecek şekilde blüyorum ama;
Alıntı yapılan: bunalmis - 08 Haziran 2011, 10:24:20
...
Simdi C bilenler yazdiklarima anlam veremiyor olabilir. Ben ise C bilmeyenlerin tarafindan olaya bakiyorum.
C bilen birinin Basic ile isi ne tabiki...
Üstadım bu ifadenizden sonra; herkes için MCU tabanında kullanılabilecek makale/ders serisi, sanıyorum ki sektör adına, bu ülke için en büyük iyilik olacaktır. C öğreniyorum diyebilecek seviyedeyim ve tecrübelerin/püf noktalarının inanılmaz faydası olacağından eminim. C nin üstadları böyle bir çalışma yapmayı düşünmez mi acaba? Sıfırdan başlayarak böyle bir seri sanıyorum yıllar boyunca hayır duası sağlar.
Merhaba
C öğrenecekler için türkçe ve oldukça iyi bir internet sitesi adresi vereyim. Buradan adım adım takip edin, rahatlıkla orta seviyede C programı yazabilirsiniz. Ayrıca yazdığınız programları devc++'da derleyip çalıştırabilirsiniz.
http://www1.gantep.edu.tr/~bingul/c/index.php
Yukaridaki bilgicikler cok fazla değil. Bunlari anlamadan bu yaziya gecmeyin.
Basicde array tanimlamalari haric hic bir degisken tanimlamasi yapmadan programi paldir kuldur yazmaya baslayabilirsiniz. Gerci bu, kullanilan Basic e gore degisiklik gosterse de bosverin dedigim gibi olsun.
Ornegin Basicde daha ilk satira A=A+1 yazabilirsiniz.
C de muhakkak kullanilacak degiskenler tek tek tanimlanmalidir.
Burada onemli bir noktaya geldik. C de degiskenler nasil tanimlanir?
Ayrintiya girmeden Global degiskenler ve Lokal degiskenler seklinde 2 degisken tanimlama sansimiz oldugunu kabul edin.
Bu konuyu izah etmekte zorlanacagim cunku C de fonksiyon denen kavramdan henuz haberdar değiliz.
Fakat global degiskenleri hemen aciklayayim.
Basic de A=A+1 gibi bir satir yazdigimizda A ve B global iki ayri degiskendir.
Hangi satirda yada Gosubla gidilen hangi alt satirda A ve B derseniz deyin hep ayni A ve B degiskeninden bahsedilir.
BASIC de
GOSUB MAIN ' Burasi basic programimizin ilk baslayacagi satir
END
MAIN:
A=1
GOSUB HESAPLA
PRINT B
RETURN
HESAPLA:
B=A
RETURN
gibi bir program parcasi dusunelim.
Buradaki A ve B Global iki degiskendir.
C de ayni islemi su sekilde yazariz. (Diyelimki A ve B 16 bit integer degisken)
//Burasi C programimizin en tepesi
int a; // a degiskeni integerdir.
int b; // b degiskeni integerdir.
// int a,b; istersek boyle de yazarark a ve b nin integer oldugunu bildirebilirdik.
void hesapla(void)
{
b=a;
}
void main(void)
{
a=1;
hesapla();
prnt(a);
}
Yukaridaki C program ile hemen ustundeki Basic program bire bir aynidir.
Dikkat ederseniz
int a,b; seklinde tanimi main ve hesapla bolgesinin disinda tanimladik.
Bu a ve b degiskenlerinin programin her yerinden okunup degistirilebilecegi anlamina gelir. Iste bu tip degiskenlere global degisken deriz.
Basicde Hesaplama ve MAIN alt programini GOSUB ile cagirmistik.
Hesapla ve MAIN rutininin sonunda da RETURN komutu var.
BASIC'de GOSUB ile cagirdigimiz program parcasinin C deki adina fonksiyon diyoruz.
void hesapla(void) // Burasi Basic deki.HESAPLA: etiketine karsilik geliyor.
{ fonksiyonun basladigini gosteriyor.
} RETURN un ta kendisi.
/*-----------------------------------------------------------------------------------------------------------------------------------------------------
Bu asamada Global degisken nedir, fonksiyon nedir, main satiri nedir cok iyi bildiginizi varsayiyorum
-----------------------------------------------------------------------------------------------------------------------------------------------------*/
Gelelim statik degiskenlere.
C programin tepesinde int a,b; seklinde bir tanim yaparak a ve b nin integer tipinde global degiskenler oldugunu
derleyiciye bildirmistik.
Simdi bu satiri silip main ve hesapla fonksiyonlarinin icine kopyalayalim.
void hesapla(void)
{
int a,b;
b=a;
}
void main(void)
{
int a,b;
a=1;
hesapla();
}
Iste buradaki a ve b artik lokal iki degisken haline geldi. Fakat artik maindeki a ile hesapladaki a ayni a değil.
Isimleri ayni gorunuyor ama hic alakalari yok.
BASIC de bunun bildigim kadariyla karsiligi yok.
Yukaridaki programda main fonksiyonu a=1 yapip hesapla() ile hesapla rutinini cagirdiginda hesapla rutinindeki a tanimsiz bir degerdir.
Cunku bu a ya herhangi bir atama yapilmamistir.
Su anda statik olarak tanimlanmis degiskenlerin sadece icinde bulundugu fonksiyondaki program satirlari tarafindan kullanilabildigini anlamis olduk.
Peki main fonksiyonundaki a degerini hesapla fonksiyonuna nasil aktaracagiz?
Iste bu soru void olarak yazilmis ve su ana kadar anlatilmamis kelimeninin ne anlama geldigini de cevap verecek.
Malesef lokal degisken tanimini anlatabilmek icin bu voide el atip aciklamak zorundayim.
void hesapla(void)
{
b=a;
}
yesil voidi kaldiriyorum ve yerine int x yaziyorum
void hesapla(int x).
boyle yazdiktan sonra artik bu fonksiyonu hesapla() olarak değil hesapla(12) yada hesapla(a) gibi cagirmak zorunda kaliriz
hesapla(12) demek hesapla fonksiyonuna int 12 degerini gonder demektir.
peki 12 sayisinin int oldugunu nerden anladim? Hemen fonksiyonun yazildigi satira bakalim.
void hesapla(int x) yaziyor. parantez icinde int x yaziyor. iste buradaki int den dolayi 12 sayisinin int oldugunu anladik.
eger hesapla(a) demis olsaydik bu durumda hesapla fonksiyonuna a'nin degeri gidecekti.
Simdi main ve hesapla fonsiyonlarini asagidaki gibi yaziyorum.
void hesapla(int x)
{
int a,b;
b=x;
}
void main()
{
int a,b;
a=1;
hesapla(a);
prnt(b)
}
void hesapla(int x) de neden int x yazdim da x yerine a yazmadim?
ne isterseniz yazabilirsiniz. ben x yazdim ve fonskiyon icinde de b=x dedim. siz int y yazin b=y diyin.
Peki simdi a=1 ardindan hesapla(a) ile hesapla fonksiyonuna geldik b=x yaptik. Aslinda !!!! b = maindeki a degiskeni oldu. !!!!
ve } ile gerisin geriye mainde kaldigimiz yere geldik. Peki main fonksiyonundaki b degeri acaba hesapla fonksiyonunda bulunan yani b=a degerimi?
Tabiki hayir.
Cunku bunlar lokal degiskenler ve sadece icinde tanimlandiklari fonksiyon icinde anlam ifade ederler.
main fonksiyonundaki b degeri hesapla(a) isleminden hic etkilenmez.
ne yapabiliriz?
Cozum 1.
int b;
void hesapla(int x)
{
b=x;
}
void main()
{
int a;
a=1;
hesapla(a);
prnt(b)
}[/color]
Bu cozum b degiskenini global yapma esasina dayanir.
Cozum 2.
int hesapla(int x)
{
b=x;
return(b);
}
void main()
{
int a,b;
a=1;
b=hesapla(a);
prnt(b)
}[/color]
Bu cozum de ise hesaplanin solunda kalan void kelimesini int yaparak yani fonskiyonun kendisini cagiran fonksiyona return degeri ile integer deger gonderecegini bildirme esasina dayanir.
Dikkat ederseniz main fonksiyonunda b=hesapla(a) ile hesapla fonksiyonunun geri gonderdigi return degerini yakalamis olduk.
Su anda void main(void) de voidlerin ne anlama geldigini
int hesapla(void) de void ve int in ne anlama geldigini
void hesapla(int x) de ne anlama geldigini int x de x in ne oldugunu anladiginizi saniyorum.
C deki return(XXX) degeri int func( deki int kismi ile alakalidir.
eger return olmayacaksa fonksiyon yazilimi da void func( seklinde donusur.
Arada bir tepki vermenizi bekliyorum.
Anlatim sekli kotu yada iyi, anliyoruz, anlamiyouz, fazla laf kalabaligi ediyorsun vs vs.
Bunalmış Üstadım;
Kırmadığınız için teşekkür ederim.
Kaynak çok ama bazı pedagojik sorunlar göz önüne alınmadığı için ciddi sorunlar oluşuyor. C ye başlarken nette bulamadığım bazı noktalar vardı ki beni bezdirmişti. Mantığım ezberci olmadığı için, Main neden bazen void ile yazılıyor, farklı tanımlar neden yapılıyor,
linker nasıl çalışıyor, IDE nasıl/hangisi kullanılmalı vb. bir çok noktayı nette bulamadığım için beni bezdirmişti. Muhtemelen yeni başlıkta bu konularda tartışılacak/konuşalacak ve yeni başlayan birisi için baş ucu kaynağı olacaktır. Elbette yeni başlayan/başlayacak arkadaşlar, muhtemelen operatörler de, yapılarda ve özellikle pointer kullanımında ciddi sıkıntı yaşayacak ve umarım bu link yardımcı olacaktır.
Tepki konusuna gelince sanırım biraz erken, kafalarda bazı noktalar oturdukça soruların ve yorumların gelmesini bekliyorum. Anlatımınız çok güzel, olaya öğrenen gözünden bakıyorsunuz. Bu soru sayuısını azaltacaktır.
Haklısınız, konunun bölünmesi hoş değil. İlerde bazı konularda istişare/ tartışma durumlaarı da oluşacaktır. Mod arkadaşlar sabit bir başlık açsalar ve ilgili mesajlar oraya taşınsa; hem bu konu bölünmez, hem de diğer konu kendi akışında başucu linki olarak kalır.
Eger C ye henuz giris yapiyorsaniz Borland TC 3.0 yuklemenizi oneririm. Simdiki isletim sistemlerinde calisir mi bilemem.
Bununla dogrudan PC uzerinde pratik yapabilirsiniz. C yi mikrolar uzerinde ogrenmek bence dogru degil. Programi derle flasa yukle vs vs
ayak bagi olacak cok sey var. TC ile pratik yaptiktan sonra mikrolarla calismaya gecebilirsiniz.
Sonuclari printf ile ekrana basip cok hizli yaz bozlar yaparak ogrendiklerinizi kendi kendinize test edebilirsiniz.
Selam,
Ben de TC++ 3.0 ile C++ öğrenenlerdenim. O zamanlar Windows 98 ve Ms-Dos vardı. İkisi de tarih oldu tabi. Ancak ben de OOP arayüzlerine ve mcu'larda C dilini öğrenmeye karşıyım, kullanmaya değil tabi.
Analyzer
Turbo C++ 3.0 msdos 6.22 üzerinde ilk C öğrenme çablarım geldi aklıma
şu adresten download edebilirsiniz
http://www.bestfreewaredownload.com/freeware/t-free-turbo-c--freeware-flggsdpz.html
Şu adrestende 64bit vista win 7 üzerine nasıl kuracağınız hakkında bilgi alabilirsiniz
http://blog.bestsoftware4download.com/2010/02/how-to-install-turbo-c-on-windows-7-64bit/
Alıntı yapılan: bunalmis - 08 Haziran 2011, 15:40:58
Arada bir tepki vermenizi bekliyorum.
Anlatim sekli kotu yada iyi, anliyoruz, anlamiyouz, fazla laf kalabaligi ediyorsun vs vs.
void hesapla(void)
{
int a,b;
b=a;
}
void main(void)
{
int a,b;
a=1;
hesapla();
}
Iste buradaki a ve b artik statik iki degisken haline geldi. Fakat artik maindeki a ile hesapladaki a ayni a değil.
Isimleri ayni gorunuyor ama hic alakalari yok.
Gözüme çarpan bir yanlışı düzelteyim.
Hesapla fonksiyonu içindeki a,b değişkenlerine lokal değişken denir, statik değişken denmez. Statik değişken tanımlamak için "static" keyword'u kullanmak zorundasın. Static ile local değişken arasında şöyle bir fark vardır.
local değişken : fonksiyon içinde kullanılır ve fonksiyondan çıkarken kullanım dışı yapılır yani tekrar hesapla fonksiyonuna erişildiğinde içeriği korunmaz.
static değişkende ise sadece o fonk. içinde kullanılır ve içeriği silinmez.
örnek:
void hesapla(void)
{
static int a=0; // static bir değişkendir, ilk değeri sıfır yapılır, daha sonraki çağırmalarda a içine 0 atılmaz
int b; // local değişken,
// default olarak b=0'dır, her çağırmada 0 atılır
a=a+1; // her hesapla fonk. çağırıldığında 1 artar
b=a; // b=a olur
} // b değişkeni yok edilir, a değişkeni ve içeriği korunur
Selam,
@eemkutay :
Demişsiniz ki int b; ile lokal tanımlandığında b=0 olur default olarak. Bundan emin misiniz? Basic'de değişken kullanılmadan önce içeriğine sıfır yazılır ancak C++ de değişken tanımlandığında pointer'ında ne değer varsa o değeri alır. Bu nedenle biz değişken içeriğini kullanımından önce değiştiririz. Hatta derleyici de uyarı verir, bu değişkenin içeriğini değiştirin diye.
Analyzer
Alıntı yapılan: Analyzer - 08 Haziran 2011, 16:28:47
Selam,
@eemkutay :
Demişsiniz ki int b; ile lokal tanımlandığında b=0 olur default olarak. Bundan emin misiniz? Basic'de değişken kullanılmadan önce içeriğine sıfır yazılır ancak C++ de değişken tanımlandığında pointer'ında ne değer varsa o değeri alır. Bu nedenle biz değişken içeriğini kullanımından önce değiştiririz. Hatta derleyici de uyarı verir, bu değişkenin içeriğini değiştirin diye.
Analyzer
Merhaba Analyzer,
Doğru haklısın, local değişken içeriği bilinmeyen bir değer alır. local değişken içine mutlaka birşeyler yazmak gerekir.
static in bir diğer kullanım amacı ise, kullanıldığı global değişkenin veya fonksiyonun sadece o modülde tanımlı olmasını sağlamaktır. yani static öneki ile tanımladığınız global değişkenler veya fonksiyonlar absürd bir tanımla "local global" olur.
takıldığım 1. nokta static yerine local elimesi o değişken için daha anlamlı geldi ok
2.si ise peki hesapla() fonksyonuna main'den a, c ve d değerlerinide göndermek istersek bunları global yapmadan nasıl göndericez
Çözüm-3 diyebiliriz: http://www.cplusplus.com/doc/tutorial/functions2/
Örnek program ve çıkış değerleri mevcut. Kabaca, fonksiyona değişkenleri değil değişkenlerin bir çeşit adresini gönderiyoruz. Fonksiyon içerisinde yaptığımız değişiklikler, ilgili adresteki değişkenlere yansıyor.
Ek: Daha rahat anlamak için pointer konusuna bakabilirsiniz: http://www.cplusplus.com/doc/tutorial/pointers/
Arkadaşlar, konu başlığı ile alakası kalmadı. Mod arkadaşlardan birisi bu konuyu ayırıp sabit başlık haline getirebilir mi?
Bir diğer nokta ise; C derken C++ karışmaya başladı. Bence C++ ı unutun. Sadece C hakkında bilgiler ve açıklamalar olmalı. Yoksa Class, object, polymorphism, inheritance gibi konulara da girmek gerekecek. Bir de çok karışık gitmek doğru değil kanımca. Baştan başlıyarak Bunalmış Üstadığın izlediği yol gibi sıfırdan başlayarak almak daha doğru diye düşünüyorum. Dediğim gibi pedagojik açıdan bakmak lazım ve niyetli olanların gözünü korkutmamalı. Nette gördüğüm en büyük hata bu idi. Arada konular eksik ama 3. konuda pointerdan bahsedilmiş ama daha dizileri bilmiyorum ki!
Bu arada, benim öğrendiğim 2 kaynak aşağı da.
http://www.cagataycebi.com/programming/index.html (http://www.cagataycebi.com/programming/index.html)
http://www1.gantep.edu.tr/~bingul/c/index.php (http://www1.gantep.edu.tr/~bingul/c/index.php)
Basic ile C arasındaki temel farklardan birisini söyleyeyim.
C öncesi dillerin nerede ise tümü,
İşi yazılım olmayan insanlar için geliştirilmiş dillerdir.
C ise yazılımcı insanlar için tasarlanmış bir dildir.
Kaynakçasını aratmayın bu sözün bi yerde okudum :)
Alıntı yapılan: eemkutay - 08 Haziran 2011, 16:45:31
Alıntı yapılan: Analyzer - 08 Haziran 2011, 16:28:47
Selam,
@eemkutay :
Demişsiniz ki int b; ile lokal tanımlandığında b=0 olur default olarak. Bundan emin misiniz? Basic'de değişken kullanılmadan önce içeriğine sıfır yazılır ancak C++ de değişken tanımlandığında pointer'ında ne değer varsa o değeri alır. Bu nedenle biz değişken içeriğini kullanımından önce değiştiririz. Hatta derleyici de uyarı verir, bu değişkenin içeriğini değiştirin diye.
Analyzer
Merhaba Analyzer,
Doğru haklısın, local değişken içeriği bilinmeyen bir değer alır. local değişken içine mutlaka birşeyler yazmak gerekir.
Biraz daha açıklayıcı yazacak olursak;
Lokal değişkenin adresi RAM de bir bölgeye denk gelir ve eğer o fonksiyon haricinde derleyici o RAM bölgesini başka bir iş için kullanmıyorsa doğal olarak lokal değişkenin değeri de değişmeyecektir. Kesinlikle değerinin değişmemesi isteniyorsa önüne "static" kelimesi eklenir ve değişken bir çeşit global değişkene dönüşür. İstisnai durumlar hariç lokal değişkenlere ilk değer atanmalıdır, çünkü C derleyicileri minimum değişken kullanmayı amaçladıkları için büyük ihtimalle o RAM bölgesini diğer fonksiyonların lokal değişkenleri için kullanacaklardır. İstisnai dediğim durumlarda da zaten değişken lokal olmaktan çıkmaktadır.
Ayrıca;
Alıntı YapThe Ten Commandments of C Style
A remedial course for caps criminals 1
Woe be to those errant scribes who ignore capitalization in the writing of the C program, and a plague of frogs on those who turn off the switch of capitalization.
Thou shalt not capitalize statements such as the "if" or the "for".
CONSTANTS shall be shouted to the multitudes in all caps, from every rooftop and steeple, as they are the unchanging firmament and change not through all time, and woe be to those that confuse them with variables.
Those Types and Structures which are user defined shall be presented with the first letter capitalized, as they are the high born, lest they be confused with the lesser variables, nor with the shouted CONSTANTS.
Variables shall be lower case, even as they start a sentence, for they are the low and common peasant workers doing the everyday drudgery of programming work, and must not be confused with the high-born Structures, nor with the ever-stable firmament of CONSTANTS.
Brothers have come to blows o'er the use of long variable names, with many favoring the internal capitalization, thus the use of
long int numberOfPeopleInHell;
whereas others have countered with heated words that the proper way would be
long int number_of_people_in_hell;
Woe be to those who use either name, for it is likely not unique in the first six to eight letters, making some compilers gnash their teeth, while the true scope of the number of people in hell would vastly exceed the capacity of the long int, causing the dreaded plague which infecteth, locketh-up and rebooteth all computers from the lowly PIC to the mighty Cray.
While much blood has been shed over the issue of the curly brace, and many are the programmers that have argued that opening curly braces should go on their own line, while others have protested with sword-in-hand that they must go on the same line as the statement, and many have come to blows over this, the closing curly brace shall be indented to the same level as the opening function.
Thou shalt not comment the obvious. Those rapscallions and heathens who penned the line:
i++; /* Add one to i */
shall be forever banned from the inner circle of C, though their resume grow long and their accomplishments and finished code stretch out before them like a lake of ASCII text. Likewise, any code which is not obvious, or obfuscates and bebothers the user, shall be extensively commented so as to make clear the intent of the programmer.
Thou shalt comment the author, date, and revision of each C program, and lo, other comments shall be brief, descriptive, to the point, yet clear as the purest mountain spring water in their explanation and clarification of the code. Each function shall have as its companion a description of its function, its inputs and outputs, as each dog has its day and each actor his moment on the stage. Thou shalt document the purpose of each and every I/O pin in an embedded processor, and for each variable, data member or Structure there shall be a comment which shall illuminate and enlighten the reader of the program as to its use.
Thou shalt properly indent programs, each subservient function being indented one level more than its master.
Statik ve Lokal karmasasi icin ozur.
Lokal degiskenimiz dogrudan ramin stack alaninda tutulur.
static on eki ile statik hale getirdigimizde bu degisken de global degisken gibi ramda tutulmaya baslanir. Fakat diger fonksiyonlar erisemez.
Sadece 2 dersde
main fonksiyonunun anlami,
Lokal degisken, Statik degisken, Global degisken,
Degisken tanimlama,
fonksiyon tanimlama,
fonksiyona parametre gonderme,
fonksiyondan return degeri alma,
gibi temel taslari ogrendik.
Simdi degisken tiplerine bakalim.
karakterlerle yada isaretli byte tipi verilerle ugrasmak icin char
integer isaretli sayilarla degerlerle ugrasmak icin int
isaretsiz integer sayilarla ugrasmak icin unsigned int
Ornek olarak asagidaki main fonksiyonu girisindeki degisken tanimlamalarina bakalim
void main(void)
{
unsigned int a;
int b=1;
char c;
unsigned char d[5]={'D','E','R','S',0x00}
int sayilar[10];
.....
.....
unsigned integer tipinda a degiskenimiz var. Bu durumda a=0....65535 araliginda deger alabilecek.
int b tipinde degiskenimiz main satirina girer girmez 1 degerini almis. -32768..+32767 araliginda deger alabilecek
signed char tipinde c degiskenimizle -128..+127 araliginda deger alabilecek
char tipinde c degiskenimizle 0..255 araliginda deger alabilecek
unsigned char tipinde d degiskenimiz bir karakter array ve icine DERS kelimesi yazilmis.
int tipinde 10 tane eleman yerlestirilebilen array'imiz var
(String tipi verilerle simdilik calismayacagiz.)
Artik denemeler yapabilecek konuma geldik. Yapacagimiz islemlerin sonuclarini ekranda gorebilmek icin (PC de Borland TC 3.00 ile calistigimizi varsayiyorum) printf komutunu detaylandirmadan kisaca ogrenelim.
printf("%d",a); a sayisini decimal formatta print et.
printf("%d\n",a); a sayisini decimal formatta print et ardindan satir atlat.
printf("%4x",a); a sayisini hexadecimal formatta print et.
printf("Sonuc:%d\n",a); Sonuc: 123 benzeri olsun.
printf("Sonuc1:%d Sonuc2:%d\n",a,b); Sonuc1: 123 Sonuc2:456 benzeri olsun.
printf("Merhaba");
Yukaridaki printf orneklerini inceleyerek komutu kavrayabilirsiniz.
a=a+1;
b=b-1;
c=a/b;
d=a*d;
4 isleme ait ornekler.
a=a+1; yerine a++;
a=a-1; yerine a--;
a=a+2 yerine a+=2;
yazabilirsiniz.
printf komutunu kullanabilmek icin programin tepesine
#include <stdio.h>
yazmamiz gerekir.
Bu satir stdio.h dosyasinin programimiza dahil edilmesini saglar. Aksi halde printf komutu calistirilamaz.
Kendi kendinize denemeler yapmak icin lazim olacak ilave iki komut if karsilastirmasi ve for dongusu olacak.
Daha once and or xor not mantiksal islemlerine bakalim.
a=0x10; // 10 Hex sayisina karsi gelir.
void main()
{
int a,b,c;
a=0x01; b=0x02;
c=a|b; // c= a or b
c=a&b; // c= a and b
c=a^b; // c= a xor b
c=~a; // c= not a
}
if karsilastirmasi
Basicdeki ornegimiz if a=10 then print "a esittir 10" C deki ornegimiz if (a==10) printf("a esittir 10");
Basicdeki ornegimiz if a<>10 then print "a esitdeğil 10" C deki ornegimiz if (a!=10) printf("a esit değil 10");
if (a=1) and (b<>2) then x=1 if ((a==1) && (B!=2)) x=1;
if (a=1) or (b<>2) then x=1 if ((a==1) || (B!=2)) x=1;
if (a==1)
{
// a=1 ise burdaki komutlar calistirilir.
}
else
{
// a<>1 ise burdakiler calisir
}
Gelelim for dongusune
for i=0 to 9 step 2 for (i=0;i<10;i=i+2)
Eger Basicde program yazabiliyorsaniz bu dersden itibaren C ile basit denemeler yapabileceginizden eminim.
Alıntı yapılan: SpeedyX - 08 Haziran 2011, 18:40:04
Alıntı yapılan: eemkutay - 08 Haziran 2011, 16:45:31
Alıntı yapılan: Analyzer - 08 Haziran 2011, 16:28:47
Selam,
@eemkutay :
Demişsiniz ki int b; ile lokal tanımlandığında b=0 olur default olarak. Bundan emin misiniz? Basic'de değişken kullanılmadan önce içeriğine sıfır yazılır ancak C++ de değişken tanımlandığında pointer'ında ne değer varsa o değeri alır. Bu nedenle biz değişken içeriğini kullanımından önce değiştiririz. Hatta derleyici de uyarı verir, bu değişkenin içeriğini değiştirin diye.
Analyzer
Merhaba Analyzer,
Doğru haklısın, local değişken içeriği bilinmeyen bir değer alır. local değişken içine mutlaka birşeyler yazmak gerekir.
Biraz daha açıklayıcı yazacak olursak;
Lokal değişkenin adresi RAM de bir bölgeye denk gelir ve eğer o fonksiyon haricinde derleyici o RAM bölgesini başka bir iş için kullanmıyorsa doğal olarak lokal değişkenin değeri de değişmeyecektir. Kesinlikle değerinin değişmemesi isteniyorsa önüne "static" kelimesi eklenir ve değişken bir çeşit global değişkene dönüşür. İstisnai durumlar hariç lokal değişkenlere ilk değer atanmalıdır, çünkü C derleyicileri minimum değişken kullanmayı amaçladıkları için büyük ihtimalle o RAM bölgesini diğer fonksiyonların lokal değişkenleri için kullanacaklardır. İstisnai dediğim durumlarda da zaten değişken lokal olmaktan çıkmaktadır.
Buna dinamik adresleme işlemi denir. Dinamik adreslemede, küçük programlarda bahsettiğin gibi aynı register, aynı değişken için atanabilir ama program büyüdükçe / değiştikçe aynı register aynı değişken için atanması garanti değildir. Yoksa local değişken tanımı olmazdı.
Simdi de pointer kavramina bakalim.
pontere neden ihtiyac varla baslayalim.
Asagidaki gibi bir fonksiyon dusunelim.
void hesapla(int a, int b)
{
int x,y,z,w;
x=a+b;
y=a-b;
z=a*b;
w=a/b;
}
peki hesaplanan x,y,z,w degerlerini cagiran fonksiyona nasil iletebiliriz? (malesef int int int int hesapla(int a, int b) yazamiyoruz)
Cozum 1. Global degisken kullanmak
int x,y,z,w;
void Hesapla(int a,b)
{
x=a+b;
y=a-b;
z=a*b;
w=a/b;
}
Cozum 2
void Hesapla(int a, int b, int* x, int* y, int* z, int* w)
{
*x=a+b;
*y=a-b;
*z=a*b;
*w=a/b;
}
Burada int *x, gelen veri, x degiskeninin degeri değil adresidir demek.
*X = a+b; demek a+b islemini yap ve sonucu adresi verilen alana yaz demek.
Peki bu fonksiyonu cagirirken nasil adres verecegiz?
main void() // burada parantez icine void yazacaksak yazmayabilme serbestligimiz var
{
int a,b,c,d;
Hesapla (4, 5, &a, &b, &c, &d);) // Buradaki &a, a degiskeninin adresinin sayisal degeri demektir.
}
-------------------------------------------------------------------------------
pointeri anlamak icin bir baska ornek
void main()
{
int a,b; // a ve b integer iki degisken
int* p // p, integer degiskenlerin adresini saklayabilen bir degisken, yani bir pointer
p=&a // a degiskeninin adresini p ye yukledik
a=1; // a=1 yaptik
b=*p; // p degiskenindeki adresdeki veriyi b ye yazdik. (b=a oldu)
}
Pointer denen sey de bundan ibaret.
O halde bir fonksiyondan istedigimiz kadar sonuc geri dondurebiliriz. Daha dogrusu, bir fonksiyondan, istedigimiz kadar degiskenin icine deger yazmasini isteyebiliriz.
Gordugunuz gibi ortalikta bir tane bile global degisken yok.
Basic de tum degiskenler global degisken
Basic deki global degiskenlerin zarari ne? Neden C de de global degiskenleri dayayip gecmiyoruz? Adresmis pointermis kendimizi sikintiya sokuyoruz?
Global degisken rama yapistimi suluk gibi kalan bir degiskendir. Yani ramdan yer tirtiklar.
x=a+b;
y=a-b;
z=a*b;
w=a/b;
hesaplandiktan ve kullanildiktan sonra artik x,y,z,w nin ramda yer kaplamasinin anlami yok.
Bunlar uzun programlarda hissedilir sekilde ramda yer kaybina neden olurlar. Bu nedenle de global degisken kullanimi pek tercih edilmez.
Fakat mikrolar artik buyuk ram kapasitelerine sahip olduklarindan bu konuya cok da dikkat etmeyebilirsiniz.
Eger
x=a+b;
y=a-b;
z=a*b;
w=a/b;
hesaplanan x,y,z,w sonuclari, pek cok fonksiyonda girdi olarak kullanilacaksa bunlarin global olmasinda fayda vardir. Aksi takdirde
fonksiyon cagirimlarinda zirt pirt bunlarin adreslerinin fonksiyona gonderilmesi gerekir ki bu da bu kez romdan kaybetmek anlamina gelir.
Goruldugu gibi C de BASIC teki basit yapidan adim adim uzaklasiyoruz.
Bu detaylar kotumu? Elbette hayir.....
Ben şahsen, şimdiye kadar yılardır basic kullanmış birisiyim... İçimden hep C ye geçmeyi arzu ederdim ama olmazdı. Sonunda geçen sene nasip oldu... Şu an Keil C51 kullanıyorum... Önceden basic' i savunurdum. Ama şimdi ikisini de kullanmış birisi olarak C den vazgeçmem herhalde...
Arkadaşların da dediği gibi, pointer, structure yapıları, fonksiyon yapıları, hem kullanış hem de vizibilite açısından mükemmel. İnsanın yazdıkça yazası geliyor kodları :)
Hadi bunu da geçtim... Bilmediğiniz bir konu. bilmediğiniz bir IC... En sağlam kaynak neresidir? Elbette üretici firmanın "Reference Design" ları ve "Application Note" ları... Üretici firmanın sitesine giriyorum bakıyorum hemen C kaynak kodları, hatta SDK(Software Development Kit) ları... Ayrı bir pdf'te benim için hazırladığı fonksiyonları nasıl kullanacağımı güzel güzel anlatmış...
Benim şimdiki tek beklentim Keil gibi derleyicilerin görsellik ve kullanım konusunda biraz daha ilerlemesi. IDE konusunda Visual Studio gibi bir şeyler bekliyorum açıkcası :)
CTRL+Space ' e bastığım da structure'ın elemanlarının seçilmek için alt alta sıralanmasını bekliyorum... :)
Biraz da Basicde olmayan saga sola kaydirmaya bakalim.
Basic ile 8 bit degiskenin bitlerini 8 ayri degiskene yerlestiren program yazalim.
DIM S[8]
A=137 ' olsun BUNU PARCALASIN
B=1;
FOR I=1 TO 8
IF (A AND B) <>0 THEN C=1 ELSE C=0
B=B+B;
S[I]=C
NEXT I
END
Ayni programi C de yazalim (bir suru yolu var yukaridaki mantigi aynen de kullanabilirsiniz)
void main()
{
char s[8];
char i,a,b;
a=137;
b=1;
for(i=0;i<8;i++)
{
s[i]=((a&b) ? 1:0) // ? operatorunun solundaki islem sonucu dogru ise : nin solundakini,
b<<=1 // yanlis ise : nin sagindakini al demek
}
}
b=b<<1 demek b yi bir bit sola kaydir demek
b=b>>1 demek b yi bir bit saga kaydir demek
------------------------------------------------------------------------------------------------------------------------
C de her yapilan islemin dogru yada yanlis sonucu vardir.
ornegin
if (a+b) c=1; // isleminde c=1 olabilmesi icin a+b sonucunun 0 dan farkli olmasi gerekir.
if (c=(a+b)) d=1; // c=a+b islemini yap; eger sonuc 0 dan farkliysa d=1 olsun demektir
sonucun 0 olmasi yanlis, sonucun 0 dan farkli cikmasi dogru anlamina da gelir.
Üstadım,
Başta sizin ve bilgi/yorum/açıklama yazan bütün arkadaşların ellerine sağlık.
Sıkıntılı konulardan birisi de operatörlerin efektif kullanımı? Bu konuda birşeyler yazmayı düşünüyor musunuz?
Ozel komutlar icin (ornegin stringlerle oynamaya yarayan strcpy , sprintf, strcmp vs) derleyicinin help menusune muracat edebilirsiniz.
Son olarak da structure ve union tanimlamarina deginip sizi C ile basbasa birakiyorum.
Ciplak C bu kadar. (while ve do ya siz bakarsiniz)
Standart veri tiplerinin disinda veri tipleri olusturmak icin struct deyimiden yarlaniyoruz.
Mesela A degiskeninin bir integer bir de karakter bileseni olsun.
A nin integer bilesenine 1234 hex degeri aktaralim, karakter bilesenine de 'Z' olsun diyebiliriz.
Bunun icin tanimlanmasi gereken structure;
struct Ozel
{
int IntBileseni;
char CharBileseni;
};
Boyle bir tanim ardindan mesela A degiskenine bu ozelligi atayalim.
struct Ozel A;
Artik A degiskenimizin icine deger atayabiliriz.
void main{
A.IntBileseni=0x1234;
A.CharBileseni='Z'
// A nin CharBileseni 'X' mi diye bakmak istersek
if (A.CharBileseni=='Z')
{
// Anin Char bileseni Z imis
}
}
Simdi de union tanimlamasina bakalim.
Bunun icin bir ornek yapacagim.
struct Ozel_Integer{
char H;
char L;
};
// Burada yaptigim, adlari H ve L olan char tipinde 2 tane bilesenden olusan, Ozel_Integer adini verdigim char bir degisken tanimlamak oldu.
union Ister16_Ister8_8 {
int Bir_Kerede_16_Bit_Yukle;
struct Ozel_Integer Sekiz_Bit_Yukle;
};
// Burada yaptigim ise Bir kerede 16 bit deger yuklenebilen integer tipinde ve adini Bir_Kerede_16_Bit_Yukle koydugum degisken ile;
// Daha once tanimladigim Ozel_Integer adindaki structurla ayni yapidaki Sekiz_Bit_Yukle degiskenimi ayni adrese oturtmak oldu.
// Bu ozellige de Ister16_Ister8_8 adini verdim.
union Ister16_Ister8_8 Ozel_Degiskenime;
// Burada ise adini Ozel_Degiskenime koydugum bir degisken tanimlamak ve buna da Ister16_Ister8_8 adini koydugum union ozelligi vermek oldu.
void main (void)
{
Ozel_Degiskenime.Bir_Kerede_16_Bit_Yukle=0x7890;
Ozel_Degiskenime.Sekiz_Bit_Yukle.H=0x12;
Ozel_Degiskenime.Sekiz_Bit_Yukle.L=0x34;
}
Son olarak bir uyari
main satirinin en sonuna sonsuz dongu koymayi unutmayin. Aksi takdirde C elinizden kacar gider.
Cunku buranin BASIC'deki RETURN'a karsilik geldigini soylemistim.
Son yazınız güzel olmuş. Aslında C zor değil, adam gibi günde 3 saat çalışan 10 günde temel olarak öğrenir, rahatlıkla işlemciyede program yazabilir ama bu çoğu insana zor gelir.
Kendi basina ogrenmek isteyen icin C asinda zor bir dil. (C bildiginiz icin su anda boyle diyorsunuz.)
Kisiye bir sekilde C ye giris yapmasini saglayacak bir arkadas (ogretmen) bu kisinin ufkunu bir anda acabilir.
Benim dilim asm ve C yi sevmesem de, daha once Basic ile calisan ancak C den urken arkadaslarin bu yazi dizisi ardindan C de bir seyler yapmaya basladigini bilmek beni cok memnun eder.
Bilmeyene C ile başlangıç zor ama PIC için CCS ile başlangıç kolay.
Alıntı yapılan: Allegro - 09 Haziran 2011, 01:12:29
Bilmeyene C ile başlangıç zor ama PIC için CCS ile başlangıç kolay.
ARM icin ?
Alıntı yapılan: katana - 08 Haziran 2011, 23:33:09
Sıkıntılı konulardan birisi de operatörlerin efektif kullanımı? Bu konuda birşeyler yazmayı düşünüyor musunuz?
Operatorlerin efektif kullanimi ile tam olarak neden bahsettiginizi anlamadim.
Soruyu anladigim sekliyle tum diller icin gecerli olmak uzere cevaplarsam olay operatorleri iyi tanimaktan ziyade 2 li sayi sisteminin inceliklerini iyi bilmekten geciyor.
Temel kural: Carpma ve bolmeden sakin. Bunun yerine kaydir topla/cikarta yonel.
Bende yıllarca ASM ile yardırdım ;D
VisualBasic vasıtası ile basic öğrendim. Ayrıca Basic ile bikaç işte Pic te programladım.
Şimdi Yeni yeni C öğreniyorum Hatta birkaç basit ama endüstriyel ortamda çalışacak ürünlere C ile program yazdım. Artık Asm ve Basic e ihtiyaç duymuyorum. Buradan da yeni şeyler öğrendim. Bu sebeple Bunalmış a teşekkür ederim.
Hepsini kullanan birisi olarak yorumlarım şöyle olabilir;
C çok sembolleri olan. Biraz ezber ve hatırlama gerektiren Fakat çok profesyönel ve Her yerde kullanılan bir dil.
Basic İnglizce kitap okur yada yazar gibi çalışılınan bir dil.
Asm Mükemmel güzel ve hızlı, Mükemmel yorucu bir dil ;D (Tavsiye ETMİYORUM!)
Bu aralar Visual C ile uğraşmaktayım, İşlemci programlama olayındada kendi kütüphanelerimi oluşturma .h uzantılı dosyalar yapma vb. şeyler üzerinde çalışıyorum.