10 Mart 2018 Cumartesi

C Notes

 










->                 isaretli olarak ele alirsak 1 in 2 lik sayida tumleyeni -1


->                     1
Hexadecimal sayi sistemi



Token: Kaynak kod derleyici acisindan anlamli en kucuk birimlere ayrilir buna token denir.






bunlara isim verebiliriz, kendi isimleri vardir

anahtar sozcukler isim olarak kullanilamaz.





 10 luk sayi sistemi 16 lik ve 8 lik sayi sistemini burda bu sekilde gosteririz.















local taraftaki degiskenler otomatik omurlu oldugu icin garbage value alir ama globalde baslasaydi direk sifir degeri ile baslayacakti.

Statik omurlu degiskenle e eger bir deger atanmadiysa direk sifir ile baslar.


Global degiskenler statik omurlu oldugu icin direk sifir degeri ile baslarlar

Statik ifadelere deger vermek istiyorsan sabit ifade vebilirsin 
bu olmaz









Burda isim arama biter ama isim fonksiyon oldugundan syntax hatasi verir



C++ da :: scope resolution ile globelde nesne aramasi yapilabilir. Yani + 10 dur ama  de globaldeki tanimlamayi ilk 45 tanimlamasi maskeler bu nedenle C de x degeri 45 tir. Yerel isim global ismi maskeler yani ayni bracelt icinde olmali maskeleme olabilmesi icin.








Fonksiyonun geri donus degeri buradan belirtilir int olabilir double olabilir ne belirlersen o.






C'de kullanilan parametrenin degiskenlerinin degerleri belirtilmelidir, C++ da bu gerekli degildir.





bu syntax hatasi




bu dogru








eger fonksiyonun geri donus degerini belirtmezsen eski C programlama modeline gore orda fonksiyonun geri donus degeri int olarak var sayilirdi ve buna implicint int denirdi.




Eger gercekten geridonus degeri kullanilmak istenmiyorsa function un onune void konulmali.


Eski konulara ornek:


Burda hata var mi



var x degerinin degeri ayni scope da iki kez tanimlanmis yani birden fazla varliga verilmis bu sekilde olmaz.





fonksiyon bittikten sonra a degiskenin isi de sonlanir deger tutmaz yani her fonksiyon cagrildiginda yazilan deger 10 olur.


bunun sebebi degisken local de oldugu icin automatik omurlu degiskendir bu nedenle her fonksiyon basladiginda yeniden degerin uzerine yazilir. ama statik degisken oldugunda degiskenin uzerine yazilmaz hafizada tutulur.













glabalde de yine bu degeri kullanabilirdik ve yine artan deger de bie bir sonuc verirdi, bu sefer digerlerinden farkli olarak a degiskeni globalde tanimlandigi icin tum diger fonksiyonlar bu degiskeni kullanabilirdi.










Fonksiyon icinde fonksiyon tanimlayamazsin, bu kod hatali.
Butun fonksiyonlar global alanda ayri ayri tanimlanir.
Fonksiyon icinde baska fonksiyon cagirabilirsin.
Fonksiyon disinda fonksiyon cagrilmaz.




Fonksiyonlarin geri donus degeri uretmesi ve return deyimi


Return statement


hatirlatma

ifade degimi

Birlesik deyim



bos deyim


control deyimi

onceden belirlenmis dilin kurallarinca saptanmis bir syntax i var, bu syntax geregi en azindan bir keyworde sahip olan ve run time da programin akis yonunu degistirebilen deyimlere kontrol deyimi denir


return deyiminin iki farkli kullanim bicimi var biri cok sik biri az kullanilir.







bu ifadesiz return ifadeydi.

Simdi ifadeli return ifadesi


fonksiyonun geri donus degeri  oalrak fonksiyonu cagiran koda iletilir.


return x + y:





bir programin icinde bir cok return ifadesi olabilir. Bunlar genelde control statement ile kullanilir.










burdaki else silinseydi kodda bir degisiklik olmazdi






burdaki x signed int x ' dir.








ama C dilinde hata degildir. Garbage value ortaya cikar. Bu fonksiyonu kullanmak undefined behavior a sebebiyet verir.




if in icine girmedigi durum yani else durumu belirlenmedigi icin yine undefined behavior






sayinin kac basamakli oldugunu hesaplar






program calisirsa bu yazilim da sifir degeri donucek yani true olacak diger turlu kosulda false yani main fonksiyonu return 1 donecek.
Geri donus degerleri isletim sistemine gider. Bash ile programi yurutup bash ile bu ciktiyi gorerek programin isni yapip yapamadigini anlariz.







Boyke bir fonksiyonda ne eksik?

functionun icine void yazmak her zaman daha iyidir ve fonksiyonlar her zaman bir deger dondururler o nedenle return deyimini kullanmak gerekir.






C99 da eger main fonksiyonuna return yazmazsan hata gelmez. Cunku deleyici otomatikmen kendi fonksiyonun icine ' return 0; ' yazar.


4) integer fonksiyonun kullanildigi yontem normalde o bir fonksiyondur ama geri donusdegeri eger senin ihtiyacin varsa kullanabilecegin bir bilgidir.

printf int dondurur ama harf yazar




geri donus degeri yani return value ekrana yazilan toplam karakter sayisini ifade eder.





5) Integer kullanim yontemi; Bazi fonksiyonlarin geri donus degeri yoktur bunun nedeni

mesela ekran silen fonksiyon 




Funtion Call

1) Define a Function
2)Fuction Definition
3) Funtion Call
4) Function Declaration

Fonksiyonu cagirmak demek o fonksiyonu calistirmak demek. 





Mesela burda ndgit teki x degiskenine 10 atansaydi o zaman 100 yani print edilen deger 3 olarak cikardi

Tanimlanan degisken kadar arguman gonderilmeli.




basta ndigit olarak kisimda hata yok cunku tek arguman belirlenmis ve kuallanilmis ama ikici tarafta main fonksiyonunda herhangi bir arguman kullanilmamis bu nedenle program too few argument in funtion call hatasi veriyor. 



syntax hatasi




syntax hatasi degil



C++ da ayni fonksiyon ismini kullanabilirsin yani fuction overloading yapabilirsin ama C de yapamazsin C de her fonksiyonun ismi benzersiz olmali.




C de bu olmaz ama C++ da olur.



Bu sekilde isimlandirilerek C de fonksiyonlar ayristirilabilir ve kullanilabilir.



goruldugu gibi hata var.

default argument (varsayilan arguman)


Eger func fonksiyonuna sadece iki arguman gonderilirse 10, 20 gibi ucuncu arguman daha onceden tanimlandigi icin 0 olarak kullanilir ama istenirse 30 gibi bir argumanla da z argumaninin uzerine yazilabilir.


z burda 6 dir basamak sayisni bulan ndigit programi calistirilmistir






Bu fonksiyonin geri donusumu void oldugundan yeni bir geri donusu olmadigindan statement olarak kullanilir.


Bu syntax hatasi olur.  cunku integer bir degere void bir deger atamaya calisiyoruz.



Eger geri donus degeri olan bir fonksiyonu kallnirken ger donug degeri belirtilmezse integer bool gibi bu o fonksiyonu discarde etmek olur. Herhangi bir syntax hatasi degildir. Eger geri donus degeri varsa yani sadece bir bildirim degilse logic hata vardir. Logic hata olsa yada olmasa yine de legaldir. 





Burdaki max3 gecerlidir ama logic hata vardir. Boyle bu kullanim olmussa;
birinci programci fonksiyonun amacini anlamamistir,
ikincisi geri donus degerini kullanmayi unutmustur.


Fonksiyonun geri donus degeri bir degiskende sakalanarak genellikle geri donus degeri kullanilir.


1. Fonksiyon cagri ifadesi ile bir degiskene ilk deger vermek to initialize variable with a function call expression

2. Ya da fonksiyonun geri donus degerini bir degiskene atamak  to assign return a value of the function



Yada bu bir atama olabilir.

Neden bir fonksiyonun geri donus degerini bir degiskende sakliyoruz.




Ayni fonksiyonu degiskensiz farkli yerlerde yazarsam kafa karisikligina sebebiyet verebilir o nedenle degiskende saklamayi tercih ederiz. Cunku normalde fonksiyon tekrar tekrar yazilmaz degiskende saklanir. 



 Bos yere kaynak kaybi yasanir zaten hesaplanbir fonksiyonu tekrara tekrar hesaplatmak programin kapladigi alani arttirir.

b) bazen degeri hesapladigin yer ile kullanacagin yer farklkidir.



Eger bir fonksiyonun degeri sadece bir kere kullanilacajsa baska bir degiskende saklanmamalidir sebebi cirkin, garip gorunur.


Cok fazla degisken kulsan yanlislikla daha onceden kullandigin bir degiskeni kullanabilirsi ve bu hataya sebep olur.


scope leakage a sebep olabilir. Bir ismi kullanilmadigi yerlerde de kullanabilirsin orda kullanmaman gerekiyordur. Kapsadigi yerde bunu yaparsan syntax hatasi vermez ve yanlis yerde yanlis degisken kullanmis olursun.





bunu yerine 
boyle kullanmak daha iyi



x*y bir ifadedir a*b de ornegin baska bir ifadedir. 

x*y > a*b  bir alt ifadedir. Main Expression ' dir. Digerlerine ise Subs expression denir.


x*y > a*b  asgidaki fonksiyonlara bakiniz:

double sin(double);
double cos(double):

if(sin(a) + cos(b ) > sqrt(x))
++cnt;





C de butun fonksiyon cagrilari call by value dur. 






Burda X degerinin degeri her zaman 23 dur. Fonksiyon cagrilari call by value dur x degiskenin kendi degerine erismez.
Bir fonksiyon baska bir fonksiyonun yerel degiskenine ancak o diger fonksiyonun adresi belirtilirse gerceklestirilebilir.




Referans sembolunu kullandigimiz anda fonksiyon cagrisi call by reference olur bu neden le x in degeri degisir.


 
Referans almasaydik o atana degiskeni fonksiyona yazma imkanimiz olmayacakti.


burda const char *p bir pointer degisken ama geri kalan , ... variedik bir degiskendir.




bu 3 noktali tokenin yani karakterin yani atomun adina elipsis denir ... . Variedik fonksiyon olabilmesi icin son parametre degiskeni elipsis olmasi gerekiyor.

 


printf in en sonundaki f  formated output function i sembolize eder.
Burda printf e bir argumanla cagri yapabiliriz sadece.


syntax hatasi


syntax hatasi yok.




Sabit lerin turlerin de char short float gibi turleri yoktur.





tam sayi sabitleri ve gercek sayi sabitleri olarak ikiye ayrilir.



bu degisken ler decimal oktan ve hexadecimal seklinde yazilmistir.



gecerli

Compiler extantion, derleyici eklentisi




derleyiciye gore o zaman int turu degil cunku benim derleyicimde int 2 byte ama baskasinda 4 byte olabilir. O nedenle bu duruma implimentation defined diyebiliriz.

hexadeceimal sekilde yazilmis olmasi burda int olarak tanimlamayacagimiz anlamina gelmiyor cunku 2 byte lik int sinirini gecmiyor.


Oktanda da yine bu ayni



Sadece tek kural unsigned int olabilmesi icin yine int eger sinirinda kalmasi lazim ama bir de sonunda U olmasi gerekiyor.


Long olabilmesi icn de sonuna L koyacaksin




bu kod hic bisey dondurmez disari bisey cikmaz




Bu unsigned  long demek


bunlarda syntax hatasi yok


bu da unsigned long long





 

boyle bir durumda her zaman unsigned uzerinden ilerler



float i kullanabilmen icin hem nokta hem de F harfi olmali lazim sonda




longun gosterimi











Control caracteri ilk 32 karakter ve 127 sayisidir yani toplamda 33 karakter vardir.








 

Bir karakterin anlami disinda baska bir anlamda kullanilmasina escape denir.

3 farkli escape sequence var 


diger son iki kensini verir yani cift tirnek ve ters bolu










bu sekilde ters bolulu yazarsan bu deger derleyicix ile yazilirsa hexadecimal ifade olarak degerleri alir x yoksa oktan deger olarak alir, bu nedenle integer degeri decimal cinsinden farklidir.


bosluk ascii de 32 degerini verir char olarak bunu derleyici aldigi icin















Programming Logic Controllers (SPS), TIA Portal

  INTRODUCTION   This report provides an overview of the TIA (Totally Integrated Automation) Portal software from Siemens. The TIA wh...