![]() |
||
|
|
#1 (permalink) |
|
Bu yazıda sizlere C’de programlama yaparken kullanabileceğiniz bazı ipuçlarından ve hilelerden bahsetmek istiyorum. Burada anlatacaklarımdan bazıları genel kurallar içinde C programı yazmaya aykırı kod parçaları da olabilir ama adı üstünde, konumuz: "Hileler".
Eğer bir değişkenin byte’larını ayrı ayrı değiştirmek istiyorsanız, bunu yapmanın kolay bir yolu var. Örneğin x değişkeninizi unsigned int olarak tanımladınız. Böylelikle x, 2byte’lık bir değişken olmuştur. x değişkeninin 2 byte’ını da ayrı ayrı değiştirmek için, char kullanılır. Char, her zaman bir byte olur. Her byte’ı ayrı ayrı ele alınıp değiştirmek için derleyiciye o byte’ların char olduğunu göstermemiz gerekir ve sonra da değişiklik yapmamız gerekir: İlk byte’ı 4 yapalım: *((unsigned char *)&i) = 4; İkinci byte’ı 15 yapalım: *(((unsigned char *)&i) + 1) = 15; Intel tabanlı bilgisayarlarda bu işlemler x’in değerini şöyle değiştirecektir: 15*256+4=3844 Bu hileyi kullanırken bir çok bilgisayar sisteminde değişken tiplerinin farklı kaydedildiklerine dikkat edin. Mesela bir başka sistemde sonuç: 4*256+15=1039 olabilir! Değişken tiplerinin uzunlukları da standard değildir. Bir tamsayı 2 byte iken başka sistemde 1 byte olabilir! C’deki çok yararlı işlemlerden biri de ?: dir. Örneğin; i = i == 4 ? 0 : i + 1; kod satırında I 4’ise I’yi sıfırlar, değilse o anki değerine 1 ekler. Eğer bir değişkenin adres değerini gerçek değerinden daha fazla kullanıyorsanız, her seferinde & işaretini kullanmak yerine 1 elemanlı bir dizi tanımlayabilirsiniz: 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); } kullanılabilir. Sadece iki değişken ile swap(yer değiştirme) işleminin yapabilir misiniz? İşaretçiler ile biraz düşünülürse bu mümkün! a’nın 1, b’nin 2 olduğunu düşünürsek; a^=b; b=^a; a^=b; Bu işlem üçüncü bir değişkene gerek kalmadan iki değerin yerini değiştirmemizi sağlar. Ayrıca bu işlem çok hızlıdır. Çünkü; a’nın 9 (1001 ikilik sistemde), b’nin de 6 (0110 ikilik sistemde) olduğunu varsayalım: kodda adım adım 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 değiştirme tamamlandı!! İki değer arasında değişip duran bir değişken nasıl elde edilir? Bunu bir örnekle açıklayalım. Örneği istenilen iki değer çevirmek gerçekten de çok kolay. Örneğimizde 8 ve 3 değerlerini 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 arasında değişip duran a değişkenini göstermektedir. a, başlangıçta 3 yapılır. Sonra bir for döngüsünde a değişkenine 11-3 değeri atanır ve 8 olur. Döngünün diğer tekrarında a değişkenine 11-8 değeri atanır ve böyle sürüp gider. Bu algoritma için şöyle bir genel formül yaratabiliriz: x ve y arasında değişen bir değişken için, sonuç = (x + y) - sonuç ‘tur. --------------------------------------------------------------------------------------------------------- Altın harflerle yaz mahlasımı. halvetim kasvet, kem gözlere şiş!... Cadü ya herru!...ya merru!...kafkef, gölge harâmilerine bir selam çak!... Abile ğatladı, demlenir simam, nüşinrevan'dan handan ummam ben. Ahu-yi felek mum, ben şamdan. düşmez kalkmaz bir Allah'tır uyan!... |
|
|
|
|
| Sayfayı E-Mail olarak gönder |
| Sponsorumuz |
![]() |
| Bookmarks | |||||||||||||
Facebook
|
Google
|
Yahoo
|
Live
|
Digg
|
Reddit
|
del.icio.us
|
StumbleUpon
|
Bluedot
|
Blinklist
|
Netvouz
|
Spurl
|
Mister-Wong
|
Furl
|
| Tags |
| hileleri |
| Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir) | |
| Seçenekler | |
| Stil | |
|
|
Benzer Konular
|
||||
| Konu | Konuyu Başlatan | Forum | Cevaplar | Son Mesaj |
| Fifa08 Hileleri | Baytar | Oyun Hileleri ve Püf Noktaları | 7 | 18.10.08 22:15 |
| Matematik Hileleri... | DeatheR | Matematik | 0 | 03.09.08 13:56 |
| Gta Vıce Cıty Hileleri | -Elisa- | Oyun Hileleri ve Püf Noktaları | 1 | 23.08.08 14:54 |
| Crysis Hileleri ! | _karantina_ | Oyun Hileleri ve Püf Noktaları | 1 | 23.08.08 14:18 |
| Age of Empires 3 Hileleri | Baytar | Oyun Hileleri ve Püf Noktaları | 1 | 23.08.08 14:15 |