Bu sayfadaki yazılar
Sayfanın metni
Sayfa 19
Bu ayki konumuz, Dizi ve İşaret değişkenleri. Bildiğiniz gibi, geçen ay fonksiyonları ve C'nin program yapısını tam olarak öğrenmiştik. C öğrenecek arkadaşlara her şeyden önce şunu belirtmek isterim ki, yeni bir konuya geçmeden önce, bir önceki konuyu tam olarak öğrenin. Bu konularda kalacak bir eksiklik yeni konulara da yansıyacak ve öğrenmenizi zorlaştıracaktır. Konuları anlamanın en iyi yolu da, bol bol örnekler yapıp bunların üzerinde çalışmak. Fakat başlangıçta örnek üretmek zor olabilir. Bundan sonra ben de bu konuda sizlere daha fazla yardımcı olmayı düşünüyorum. Diğer bir deyişle, bundan böyle sizlere kendi hazırladığım örneklerle yardımcı olmaya çalışacağım. Çünkü "The C Programming Language" kitabından verdiğim örneklerin çoğu, yeni başlayanlara göre biraz ağır gelmekte. Bu sayımızdan başlayarak vereceğim yeni ve basit örnekler, sizin konuyu daha rahat anlamanızı sağlayacaktır.
Şimdi ilk olarak işaret değişkenlerini tanımlayarak bu ayki konumuza başlayalım.
İşaretler, değişkenlerin adresini göstermek için kullanılır. Yalnız işaret değişkenleri kullanırken dikkatli olmak gerekir. Farklı bir yazılımı olduğundan dolayı, programın anlaşılırlığını etkilemektedir, işaret değişkenlerinin diğer değişkenlerden adres gösterme dışında fazla bir farkı yoktur. Aynı şekilde global ya da local olabilirler, int, char veya diğer değişken tiplerinde tanımlanabilirler. Kullanım şekli bakımından oldukça yararlıdır.
İŞARETLER ve ADRESLER
(Pointers and Addresses): İşaret değişkenleri, devamlı olarak istenilen bir adresi gösterebilir ve bu adresin değerini değiştirebilir. Değişkenlerin adresini öğrenmenin diğer bir yolu da, '&'
operatörünü kullanmaktır. Ama bu, gerçek anlamda 've' operatörü değildir. Yalnız adresini öğrenmek istediğimiz değişkenin başına konulur. Örnek olarak px ve x iki integer değişken olsun. px değişkenini, x değişkeninin saklandığı adresi göstermek için kullanalım. Yani, px=&x; olarak yazılır. Buradaki işlem sonucunda px, x değişkeninin kullandığı adresi gösterecektir. Eğer biz x değişkeninin kullandığı adresle oynamak istersek, bunu px değişkenini işaret değişkeni olarak kullanarak yapabiliriz.
Bir değişkeni işaret değişkeni olarak tanımlamak için '*' operatörünü kullanırız. Aşağıdaki örnekte x ve y int, px pointer (işaret değişkeni) olsun:
y=*px; Burada, px bir pointer değişkendir, px'in başına '*' işareti koyarak px'in göstermiş olduğu adresin değerini alabiliriz.
px=&x; y=*px; Yukarıdaki örnekte ise px, x değişkeni- nin adresini almakta. Bu işlem sonucunda y değişkeni, x değişkeninin değerini ala- caktır. Bu işlemlerden önce değişken ta- nımlamaları ise şöyle yapılmaktadır;
int x, y; int *px;
Örnekten de anlaşılacağı gibi *px tanımlaması, diğerlerine göre biraz yeni. Tek fark ise, değişkenin başındaki '*' işareti. Böylece px artık bir pointer değişkenidir. Şimdi pointer değişkenlerinin diğer kullanım şekillerine bakalım. y=*px + 1; printf("y=%d",*px); Bu örnek px'in gösterdiği adres değerinin bir fazlasını yazar. y=*(px+1); printf("y=%d",*px); Bu örnekte ise, px'ten bir sonraki adresin değeri ekrana getirilmektedir. *px=0; px'in gösterdiği adresin değeri sıfırlanır.
*px+=l; px'in gösterdiği adresin değeri bir artar.
İŞARET DEĞİŞKENLERİNİN
FONKSİYONLARLA
KULLANIMI: Bir fonksiyonun içinde işaret değişkeni kullanılıyorsa, fonksiyon çağırılırken parametreler adres olarak verilir. Çünkü burada işaret değişkenleri tanımlandıktan sonra verilen parametreler, adres olarak alınmakta ve bu değişkenlere atanmaktadır.
swap(x,y) int x,y;
{
int temp;
temp=x; x=y; y=temp; } Buradaki örnekte, x ve y'nin değerleri yer değiştirilmektedir. Fakat bu değişikli- ği yalnızca swap() fonksiyonu içinde kul- lanabiliriz.
swap(&px, &py) int *px,*py;
{
int temp;
temp=*px; *px=*py; *px=temp; } Bu kullanım daha doğrudur. Çünkü artık değişkenler arasındaki değişikliği başka bir fonksiyonda da kullanabiliriz.
Buradaki örnek ise, hex olarak 30000'den 3000f'a kadar olan adreslerin içeriğini gösteren bir programdır.
main()
{
int *pa; int f,a;
pa=0x30000;
for(f=0;f<=0xf;f++) { a=*(pa+f); printf("Adres=%x Değer=%d",pa+f,a); } } Aşağıda vereceğim örnek ise, oldukça kullanılan bir örnektir. Mouse'unuzun sol tuşunu kontrol eder. 0xbfe001 adresi, bize mouse kontrol adresini vermektedir. Sol tuşa basıp adresi okuduğumuzda, 188 değerini alırız. Bu sayede mouse kontrolünü yapmış oluruz.
main()
{
int *pm; pm=0xbfe001; printf("Devam için Sol Mouse tuşuna basınız.");
while(*pm!=188);
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 18
Merhaba! Bazen işte şu programı Crunch ettim, şu programı Pack ettim veya DeCrunch, DePack ettim gibi kelimeler duyar ya da okursunuz. Bazen aklınıza takılabilir; nedir bu Crunch, Pack, DeCrunch, DePack? Ne amaçla kullanılır? Kimler kullanır? Bir Crunch nasıl yapılır? İşte bu sorulara yanıt vermeye çalışacağız. Crunch kelimesinin sözlük anlamı çiğnemek, ezmek, sıkıştırmaktır. Pack kelimesinin sözlük anlamı ise, bohçalamak, paketlemek anlamına gelir. Bunlardan da anlaşıldığı gibi, bu işlemlerle programlar ya da dosyalar sıkıştırılır. Bunların önlerine «De» eki getirilince o kelimenin zıt anlamı ortaya çıkar. Yani sıkıştırılan programın açılıp hafızaya yerleşmesi gibi. Bazen bir oyun ya da başka bir program yüklenirken karşınıza bir mesaj, mouse işaretçisinin renk değiştirmesi, CLI textlerinin renk değiştirmesi ya da ekranın background'unda çeşit çeşit renklerin geçtiğini görürsünüz. Bu renk değişimi esnasında o dosya decrunch ediliyor anlamına gelir. İşte bu belirtileri görürseniz, program crunch edilmiş demektir.
Programları crunch etmekten amaçlar oldukça çoktur. Bu amaçları, kısaca şu şekilde belirtebiliriz: O programı kısaltmak, disketlerde daha az yer kaplamasını sağlamak, programın içindeki yazıları değiştirmek isteyenlerden korumak, Amiga assembler'la uğraşan kişiler programlarını çalışabilir hale getirmek, programı daha çabuk yüklemek gibi sebeplerden dolayı programlarını crunch ederler.
Bu crunch işlemini genellikle cracker'lar (dergimizin 4 ve 5. sayısındaki korsanlar yazısını okuyun) ve yukarıda da belirttiğim gibi assembler'la uğraşan arkadaşlar sık sık kullanır. Bir programın başına intro atarken disket tamamen doluysa, cracker'lar o zaman genellikle programı crunch etme yoluna giderler.
Sanırım crunch ve pack işleminin ne işe yaradığını, ne olduğunu anladınız. Şimdi sizlere açıklayacağım DefjamPacker, herhangi bir programı crunch etmeye yarıyor. DefjamPacker'ı ünlü cracker grup Defjam yapmış. Programın birçok versiyonu daha önce piyasaya sürülmüştü. Bu ve bunun gibi programları PUBLIC DOMAIN listelerinde görebilirsiniz.
Program ilk yüklendiğinde karşımıza "Mega-Crunch (y/n)?:" sorusu çıkıyor. Eğer RAM kartınız yoksa, burayı "n" harfi ile geçin. Eğer RAM kartınız varsa, "y"
harfine basın. Bundan sonra çıkacak soruda da, "y" harfine basın. Bilgisayarınız resetlenecektir. DefjamPacker'ı tekrar yükleyin ve aynı şeyleri tekrar yapın. Bu sefer Amiga'nız resetlenmeyecektir.
Daha sonra bizden; "Low-mem: $ ", en alçak hafıza adresini girmemizi ister (Ben Low-mem adresine genellikle $30000 yazarım).
"High-mem: $ ", en yüksek hafıza adresini girmemizi ister (Buraya da genellikle $70000 yazarım). Eğer RAM kartınız yoksa, buraya fazla büyük bir adres girmeyin, yoksa Amiga'nız crash olur. Eğer crunch edeceğiniz program çok fazla büyükse, o programın büyüklüğüne göre bir değer vermeniz gerekir.
Bundan sonra DefjamPacker, Low-mem adresiyle High-mem adresi arasında kalan adresleri temizler.
Scan-Width: Burada program bizden sıkıştırma yoğunluğunu ister. Bu vereceğimiz sayı $10 ile $8000 arasında bir değer olmalıdır. Eğer çok büyük bir değer verirseniz, crunch işlemi çok uzun sürer. Tabii bu crunch etmek istediğiniz programın büyüklüğüne de bağlıdır. Buraya $100 ile $200 arasında bir değer verirseniz, sizin için daha iyi olacaktır. Ama eğer "ben beklerim" diyorsanız, hiç vakit kaybetmeden $8000 yazın. 150 yaşınızda dergiye "crunch bitti" diye mektup yazarsınız.
Sıkıştırma yoğunluğunu da verdikten sonra, karşımıza "Load type (r=reloc, o=plain, t=tracdisk):" seçeneği geliyor. Bizim amacımız crunch etmek olduğu için o ve t seçeneklerine fazla girmeyeceğim. Eğer burada o seçeneğini seçerseniz, istediğiniz bir programın başlangıç ve bitiş adreslerini öğrenirsiniz, t seçeneği ise dataları disketin tracklarından okur ve crunch eder. Burada bizim kullanacağımız, 'r' seçeneğidir.
Buraya kadar her şeyi doğru yaparsanız, "Load-address: $ " ile crunch edilecek programın yükleme adresini isteyecektir. Bu adres, Low-mem seçeneğine verilen adresten küçük, High-mem seçeneğine verilen adresten de büyük bir değer olmamalı. Crunch edilecek programın yükleme adresini verdikten sonra, tekrar Load-type seçeneğine gelecektir. Burasını RETURN ile boş geçin. Artık crunch başlayacaktır. Program crunch edilirken "Old:" programın eski, crunch edilmeden önceki değeri, "New:" programın yeni, crunch edildikten sonraki değeri. Eğer New değeri, Old değerinden büyükse o zaman program kısaltılmamış aksine büyümüş demektir. Her şey bittikten sonra program sizin RETURN'e basmanızı bekler.
Bundan sonra karşımıza, save file bölümü gelir. JMP (JSR) address: Basic'teki RUN komutunu bilmeyen yoktur. JMP ve JSR komutunu da, Basic'teki RUN komutuna benzetebiliriz. Buraya girilecek adres, crunch edilen programı çalıştırmak için kullanılır. Şimdi buraya Load-address'de verdiğimiz adresi yazın. Flash-reg: Burada, programın decrunch'ı esnasında; background, CLI textleri ya da mouse işaretçisi renklerinin hangisinin değiştirileceğini belirtirsiniz. İstediğiniz seçeneğin numarasını, buraya yazın. Bundan sonra gelen seçeneği, n harfi ile geçin. Artık programı crunch ettiniz ve sıra programı kayıt etmeye geldi. İçinde boş yer olan bir disket takın ve programın ismini yazarak diskete kaydedin. Yanlış işlemlerde, crunch ettiğiniz dosyaları kaybedebilirsiniz.
DefjamPacker bu kadar. Eğer bu konuda merak ettiğiniz bir şeyler varsa bana yazın, mektuplarınızı bekliyorum. Bundan sonra her ay sizlere değişik bir cruncher programını açıklayacağız. Tabii ki bunların tamamı değişik programlar. Kimi çalışabilir dosyaları, kimi de data dosyalarını crunch ediyor. Bu arada bu işlerle uğraşanlara minik bir not. BYTEKILLER cruncher'ımın yeni versiyonu ülkemize geldi. Oldukça değişik özelliklere sahip olan programın açıklamasını gelecek sayılarımızda bulabilirsiniz. Gelecek ay değişik bir cruncher programında buluşmak üzere.
Hoşçakalın...