Cevapla
 
Konu Seçenekleri
Eski 30-12-07, 19:24 Çevrimdışı   #1
Dekan
Huzur Pınarı
 
Yσкє∂!¢! - ait Avatar
Genel Mesajlar: 5.514
Teşekkür etti: 1.462
Teşekkür edildi: 2.042
RepForum Gücü: 66
Forum Puanı:23493
Yσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymazYσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymazYσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymazYσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymazYσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymazYσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymazYσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymazYσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymazYσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymazYσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymazYσкє∂!¢! tanımayanı zamansız forum da kimse adam yerine koymaz
Ruhsal Durumum:
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
  Alıntı ile Cevapla
Cevapla

Konu Seçenekleri

Yetkileriniz
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı

Powered by vBulletin Copyright © 2000-2008 Jelsoft Enterprises Limited.
SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.
http://www.zamansiz.com

Bütün Zaman Ayarları WEZ +2 olarak düzenlenmiştir. Şu Anki Saat: 23:03 .