| |
| |
![]() |
![]() | | Konu Seçenekleri | ![]() |
| | #1 |
| Dekan Huzur Pınarı ![]() | C Ipuçlari ve Hileleri Options Bu yazida sizlere C’de programlama yaparken kullanabileceginiz bazi ipuçlarindan ve hilelerden bahsetmek istiyorum. Burada anlatacaklarimdan bazilari genel kurallar içinde C programi yazmaya aykiri kod parçalari da olabilir ama adi üstünde, konumuz: "Hileler". Eger bir degiskenin byte’larini ayri ayri degistirmek istiyorsaniz, bunu yapmanin kolay bir yolu var. Örnegin x degiskeninizi unsigned int olarak tanimladiniz. Böylelikle x, 2byte’lik bir degisken olmustur. x degiskeninin 2 byte’ini da ayri ayri degistirmek için, char kullanilir. Char, her zaman bir byte olur. Her byte’i ayri ayri ele alinip degistirmek için derleyiciye o byte’larin char oldugunu göstermemiz gerekir ve sonra da degisiklik yapmamiz gerekir: Ilk byte’i 4 yapalim: *((unsigned char *)&i) = 4; Ikinci byte’i 15 yapalim: *(((unsigned char *)&i) + 1) = 15; Intel tabanli bilgisayarlarda bu islemler x’in degerini söyle degistirecektir: 15*256+4=3844 Bu hileyi kullanirken bir çok bilgisayar sisteminde degisken tiplerinin farkli kaydedildiklerine dikkat edin. Mesela bir baska sistemde sonuç: 4*256+15=1039 olabilir! Degisken tiplerinin uzunluklari da standard degildir. Bir tamsayi 2 byte iken baska sistemde 1 byte olabilir! C’deki çok yararli islemlerden biri de ?: dir. Örnegin; i = i == 4 ? 0 : i + 1; kod satirinda I 4’ise I’yi sifirlar, degilse o anki degerine 1 ekler. Eger bir degiskenin adres degerini gerçek degerinden daha fazla kullaniyorsaniz, her seferinde & isaretini kullanmak yerine 1 elemanli bir dizi tanimlayabilirsiniz: int main(void) { void oku(int *toread), degistir(int *toread), islem(int *toread); int deger; oku(°er); degistir(°er); islem(°er); printf("%d", deger); } yerine; int main(void) { void oku(int *toread), degistir(int *toread), islem(int *toread); int deger[1]; oku(deger); degistir(deger); islem(deger); printf("%d", *deger); } kullanilabilir. Sadece iki degisken ile swap(yer degistirme) isleminin yapabilir misiniz? Isaretçiler ile biraz düsünülürse bu mümkün! a’nin 1, b’nin 2 oldugunu düsünürsek; a^=b; b=^a; a^=b; Bu islem üçüncü bir degiskene gerek kalmadan iki degerin yerini degistirmemizi saglar. Ayrica bu islem çok hizlidir. Çünkü; a’nin 9 (1001 ikilik sistemde), b’nin de 6 (0110 ikilik sistemde) oldugunu varsayalim: kodda adim adim ilerlersek, a^=b; : a=a XOR b, a = 1111 b=^a; : b=a XOR b, b=1001 a^=b; : a=a XOR b, a=0110 Sonuç, yer degistirme tamamlandi!! Iki deger arasinda degisip duran bir degisken nasil elde edilir? Bunu bir örnekle açiklayalim. Örnegi istenilen iki deger çevirmek gerçekten de çok kolay. Örnegimizde 8 ve 3 degerlerini seçelim. int a = 3, i; for (i = 0; i < 10; i++) { a = 11 - a; printf("a = %d\n", a); } Bu kod bizlere 3 ve 8 arasinda degisip duran a degiskenini göstermektedir. a, baslangiçta 3 yapilir. Sonra bir for döngüsünde a degiskenine 11-3 degeri atanir ve 8 olur. Döngünün diger tekrarinda a degiskenine 11-8 degeri atanir ve böyle sürüp gider. Bu algoritma için söyle bir genel formül yaratabiliriz: x ve y arasinda degisen bir degisken için, sonuç = (x + y) - sonuç ‘tur. Şahit olsun Kainat, Alemler şahit olsun . Titreyen sesin ile Yüregin şahit olsun. Çok Yakın Güzel Günler,Bir Kez Daha Ufka Bak, Hep Semaya Açtıgın,Ellerin Şahit Olsun. Ö(lürsem)S(ebebi)S(ensin) Deli Var YakalaYın ![]() |
|
![]() |
| Konu Seçenekleri | |
| |