Amiga Dünyası sayı 24, sayfa 21

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 21

AMIGA

CENKER ÖZKURT Evet Amiga'cılar, yazımız devam ediyor. Hatırlayacağınız gibi, geçen ay 'MenuDesign' adlı bir program hazırlamıştım. Şimdi bu programımızı biraz daha derinlemesine incelemeye başlayabiliriz. Açıklamalara başlamadan önce, vermiş olduğum örneği yazıp denediğinizi farz ediyorum. Eğer denemediyseniz bu açıklamaları anlamanız zor olabilir. Ayrıca programın ana mantığını da ancak programı kullanarak daha rahat anlayabilirsiniz. Evet, artık programımızın incelemesine geçebiliriz. #include <exec/types.h> #include <exec/memory.h> #include <graphics/gfxbase.h> #include <intuition/intuitionbase.h> #include <libraries/dos.h> Hatırlayacağınız gibi ilk satırlarda her zaman olduğu gibi #include satırları mevcut. Bu dosyalarda kullandığımız yapı değişkenleri ve tipleri tanımlanarak program sürüyor. Bu dosyalar bildiğiniz gibi 'include' kütüphanesinde bulunuyor. Eğer dosyalar bu kütüphane içerisinde bulunamazsa compile sırasında program hata verecektir. Bu nedenle gerek yazım sırasında gerekse de çalışma disketinizde bu dosyaların doğru yazıldığına ve bulunduğuna dikkat etmeniz gerekir.

struct IntuitionBase * Intuition Base; struct GfxBase *GfxBase; struct DosBase *DosBase;

struct RastPort *rp; struct ViewPort *vp; struct Window *window; Diğer satırlarda ise kullandığımız yapı değişkenlerini tanımlıyoruz. Burada mesela 'IntuitionBase' yapı değişkeni #include dosyaları içerisinden '#include <intuition/intuitionbase.h>' dosyası içerisinde tanımlanıyor. IntuitionBase yapı değişkenini incelemek isterseniz, bu dosyayı yükleyip inceleyebilirsiniz. Bunun yanında 'GfxBase', 'gfxbase.h' ve 'DosBase'

'dos.h' içerisinde tanımlanıyor.

Sonraki satırlarda ise kullanacağımız ekran özelliklerini taşıyan RastPort ve ViewPort, Window özelliklerini taşıyan window yapı değişkenleri bir pointer yapı olarak tanımlanıyor. Burada pointer olarak tanımlamamızın sebebi, daha önceki yazılarımda da belirttiğim gibi bu yapıların orijinal yapıları görüntülemesi amacıyla kullanılmasından doğuyor.

char title[80]; char view[30][20]; char disk[30][30]; char *name[]={" ",0}; int no=0; int fin;

char *list; Bundan sonraki değişkenlerimiz bize ait. Bu değişkenleri diğer rutinlerin de tanıyabilmesi için main dışında 'global değişken' olarak tanımladık. Değişkenlerin görevleri ise şöyle;

title -> Menu listesi içerisindeki 'menu=' ifadesinden bir sonraki satıra kadar olan cümleyi saklıyor. Burada 'menu=' ifadesinden sonraki cümle 'Amiga Dünyası Utility Disk' ise, 'title' değişkeninin her indisi bu cümleyi tutacak şekilde bir karakter saklıyor. Bu örneğe göre 'title' değişkenin içeriği de şöyle oluşuyor;

title[0]='A' title 1 ='m' title'2='i* title 3 ='g' title[4]=,a'

olarak devam eder. Dikkat ettiyseniz her indise bir karakter düşüyor. Buna göre 'title' dizisi en fazla 80 karakterlik bir diziyi taşıyabilir. Tabii ki bu sayıyı arttırmak elinizde. view -> Menu listesi içerisindeki '-' ifadesinden '+' ifadesine kadar olan cümleleri saklıyor. Tanıma göre; view[30][20];

30, saklayabileceği cümle sayısını, 20 ise cümlenin uzunluğunu belirtiyor, 'view' değişkeni, disketteki programların listesini görüntülemek amacıyla kullanılıyor.

disk -> Menu listesi içerisindeki '+' ifadesinden satır sonuna kadar olan cümleleri saklıyor. Burada gene 30, saklayabileceği cümle sayısını, diğer 30 ise uzunluğunu belirtiyor, 'disk' değişkeni disketteki programların asıl isimlerini saklamak için kullanılıyor.

name -> mouse ile seçilen programın disketteki ismini 'execv' komutunun kullanabileceği şekilde tutmak için kullanılıyor.

no -> Menu listesi içerisindeki Utility program isimlerinin sayısını saklıyor. Bu aynı zamanda disketteki programların sayısını da gösterir.

fin -> Disketten yüklenen menu listesinin file olarak uzunluğunu belirtiyor. Bu değişkene göre utility isimleri 'list' değişkeninden 'list+fin'e kadar olan bölgede aranıyor.

list -> Pointer, değişken olarak menu listesinin yüklendiği hafıza bölgesinin başlangıç adresini saklıyor. Bu değer AllocMem() fonksiyonundan alınıyor.

Programda kullandığımız ana değişkenler bu kadar. Bu değişkenler bütün alt rutinlerde tanımlıdır. Diğer değişkenler ise geçici (local) değişken olarak tanımlanıyor.

Bu tanımlardan sonra şimdi gelelim ana programın icra edildiği main() fonksiyonuna. main() içerisindeki 'argc' ve 'argv' değişkenleri, verilen parametreleri ve parametre sayılarını saklıyor, 'argc' parametre sayısı, 'argv' ise parametrenin kendisini oluşturuyor. Bir örnek vermek gerekirse;

MenuDesign df0:s/menulist Burada, MenuDesign programımızın ismi, df0:s/menulist ise yüklenecek olan listenin bulunduğu directory ve ismini belirtiyor. Bu girişe göre, argc=1, argv[1]="df0:s/menulist" olarak tanımlanır, 'argc' kontrolü ile gerekli parametrelerin girilip girilmediğini öğrenmemiz mümkün. Bu olayları,

main(argcargv) int argc; char argvfj;

int a; if(argc==1) {

printf("Usage : menu [list] \n"); return(1); }

satırları ile kontrol ediyoruz. Daha sonra,

lntuitionBase=Openl_ibrary ("intui- tion.library", 0);

GfxBase=Open Library ("graphics.- library", 0);

DosBase=OpenLibrary ("dos.lib- rary", 0);

window=lntuitionBase->ActiveWindow; rp=window->RPort;

satırları ile kullanılacak olan Library'ler ve değişkenler tanımlanıyor. Yalnız burada programın daha anlaşılır olması için, Library'lerin açılıp açılmadığını kontrol etmedim. İsterseniz siz güvenilirlik açısından kontrol edebilirsiniz.

SetDrMd(rp, JAM1); Satırında, yazı modu tanımlanıyor. Bu modlar ekrana yazarken kullanılacak mantık işlemini belirtiyor. JAM1 modu, bize üst üste yazılan karakterlerde birbirlerini yok etmemesi için kullanılıyor. Diğer bir deyişle OR işlemi yapıyor. Bu modu kullanmamamdaki sebep, print() rutini ile gölgeli yazı oluşturmak içindi. Diğer kullanılabilecek modlar ise, JAM2 ve COMPLEMENT modlarıdır. Bu modların işlevlerini deneyerek görebilirsiniz.

Daha sonraki satırlarda, programın işlevini gerçekleştiren bizim hazırlamış olduğumuz alt rutinler mevcut. Bu rutinler belirli bir sırada çağrılarak adım adım program işleniyor. Bu sıra,

Klavyeyle gezinmek için ← ve → tuşları.