Bu sayfadaki yazılar
Sayfanın metni
Sayfa 22
*
* LİIBRARY.C library örnekleri
: (C) Berktan Bestel, Şubat 1992
* Aztec C compile info: * cc libary * In library-lc
#include intuition/intuition.h #include intuition/intuitionbase.h #include functions.h
struct İntuitionBase *İntuitionBase; struct GfgBase — *GfxBase;
100,100, /* sol üst köşe x,y */
280,50, /* başlık çubuğu yazı */ 2, 1* başlık çubuğu yazı */ 1,1* başlık çubuğu arka */ NULL, /* IDCMP-flags */ | SMART - REFRESH | ACTIVATE | WİNDOWDRAG | WIN- DOWDEPTH, NULL, NULL, Window”,NULL,NULL, 100,20,640,256,/* geniş.ve yüksek- lik max-min */ WBENCHSCREEN
end(char” err)
if (win) — CloseWindow (win): if (GfxBase! NULL) Closelibrary (GfxBase); if (İntuitionBase! —- NULL.) CloselLib- rary(IntuitionBase):
if (eri) — putslerr): exit(0):
main )
IntuittonBase — ition library”,33L); if (IntuitonBase — NULL)Jend(“Can't open intuiton GfxBase — Openlibrary("grap- hics.library”,33L); if (GfxBase— -NULL) end (“Can't open graphics.library”): win - openWindow (&nw):; if (win— NULL) end (“Can't open windowỊi:
Move (win- RPort,10L,20L); Text(win- RPort, Hello,worldl 14L);
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 23
end(NULL);
Bu programın işleyişine bir göz atalım. İlk önce gereken 3 adet “include include ediyoruz. Sonra global değişkenlerimizi saptıyoruz. Bunların hepsi ya bir structure ya da bir structure'ın adresini tutacak olan bir 'pointer'. Bildiğiniz gibi C'de farklı türde değişkenleri içeren structure adında bileşik değişken grupları vardır. AMIGA'da da birazcık önemi olan her olay için işletim sistemi bir structure kullanır, bu structure'ların içinde söz konusu olan olayla ilgili bilgiler tutulur. Programların daha hızlı ve kısa olmasını sağlamak için de fonksiyonların ve programların arasında pek çok defa bu structure'ların kendileri yerine adresleri (pointer'leri) aktarılır. bunlardan İntuitionBase ve GfxBase, sırasıyla tion' ve 'graphics' library'lerin aynı adlı kontrol (Base) structure'larının hafızadaki adreslerini içeren olarak kullanılacaklar. Kullanacağımız her library için bir base-pointer tanımlamamız gereklidir ve isimleri de her library için değildir. Bu pointer'lar daha sonra, eğer gereken library'ler açılabilirse, o library'lerin adreslerini içerecektir, eğer açılamazlarsa -bunlar global değişkenler oldukları için- sıfır değerini taşıyacaklardır. Diğer yandan, açtığımız bu library'lerin bir işe yaraması için İntuition library'nin fonksiyonlarını kullanarak bir pencere açıp graphics.library fonksiyonları ile içine birşeyler yazacağız. Bunun için açılacak pencerenin adresini tutacak bir değişkene gerek var. İşte 'struct Window *win' diyerek böyle bir değişken tanımlıyoruz. Bir de bizim açmak istediğimiz pencerede olmasını istediğimiz özellikleri belirtmek için kullanacağımız “struct NewWindow' türü 'nw' adında bir structure var. Diğerlerinin tersine bu adres değil, structure'- ın kendisi, Buraya da pencerenin yeri, boyutları, başlık çubuğunda görülecek ismi, renkleri, üstünde olmasını istediğimiz gadget'lar (Düğme, buton) hakkındaki istekleriİMiİZİ yazıyoruz. main( ) fonksiyonunda ilk önce library'lerimizi açıyoruz. Bunun için Openlibrary( ) adlı fonksiyonu kullanıyoruz. Bu fonksiyonun parametreleri, açılmasını istediğimiz library'nin adı ve versiyon numarası. Örnekte kullandığım 33 sayısı Kickstart 1.2'ye denk geliyor. Eğer bilgisayarımız ROM'undaki Kickstart'ınızın versiyonu 1.2 veya daha yüksek ise istediğiniz library açılacaktır. Bu versiyon resmi olarak piyasadaki en düşük versiyon olduğu için bu sayı yeterli olacaktır. Openlibraryl ) bize açılan library'- nin base-pointer'ini geri verir. Bu adresi gereken değişkene sakladıktan sonra bir if() emri ile sıfır olup olmadığını kontrol ediyoruz. Versiyon yetmezliği veya RAM yetersizliği gibi bir sebepten dolayı library'nin açılamaması olasılığı her zaman vardır. Buna rağmen o library'ye ait bir fonksiyonu çağırırsanız AMIGA'nız bir Guru meditation mesajı ile veda edecektir. Bu yüzden AMIGA'da genel mantık olarak işletim sisteminden bir şey isteyen herhangi bir emir çağırdıktan sonra isteğinizin yerine gelip gelmediğini kontrol etmelisiniz. Çoğu fonksiyon başarısızlık durumunda geriye sıfır değerini verecektir. Örneğin burada eğer library açılamamış İse base-pointer hâlâ sıfır (NULL) değerinde olacaktır. Bu durumda, açılabilmiş olan sistem kaynaklarını kapatarak bir hata mesajı yazıp programdan çıkıp 'end( )' adlı fonksiyon çağrılır. Hafıza yetersizliği veya pencere koordinatlarının ekrandan taşması gibi sebeplerden dolayı pencere açmaya yarayan OpenWindowl ) da başarısızlığa uğrayabilir. Bu durumda geriye açtığı pencerenin structure adresi yerine sifır (NULL) gelecektir. OpenWindowl( )'a yukarıda isteklerimizi içine yazdığımız 'nw' adlı “struct NewWindow' türü değişkenimizin adresini (pointer'ını) parametre olarak veriyoruz ve geriye sıfır gelmesi halinde yine )'i çağırıyo- TUZ. Programımız hâlâ end )'e atlamamış ise gereken her hazırlık tamam demektir. Bu artık pencerenin içine yazı yazabiliriz. Önce yazı yazılacak koordinatları Movef ) ile pencerenin ortasına bir yere getiriyoruz. Bu emrin parametreleri, wİNdow'un RastPort structure adresi, win- RPort diyerek bunu elde ediyoruz ve yazının sol alt köşesinin yatay ve dikey koordinatlardır. Sonra da ) ile yazımizi yazıyoruz. Önce yine RastPort adresi, sonra da yazımız ve en son olarak da yazacağımız string'in uzunulğu. Eğer string olarak bir değişken kullanırsanız, uzunluğunu İlong)strlen(string) diyerek bulup buraya yerleştirebilirsiniz. sonra ) diyerek 5 saniye bekliyoruz. Delay( )'in parametresi saniyenin 1/50'si olarak bekleme zamanıdır, bu bir integer” olmalı. Arkasından end(NULL) diyerek programdan çıkıyoruz. Burada NULL verdiğimiz için end ) bir hata mesajı yazmadan çıkıyor. endi ) fonksiyonu, kapatacağı her sistem kaynağı (Library veya Window) için önce bir kontrol yapıiyor. Eğer ilgili değişken sıfır değilse, bu bir sistem kaynağı açılabilmiş anlamına gelir, demek ki kapatılmalıdır. Burada kullanılan üç fonksiyon (Openlibrary( ), Closelibrary( ) ve Dalay( ), açtığımız library'lere ait değildir. Peki öyleyse onları nasıl kullanabiliyoruz. Bu sorunun cevabı şudur: Her C programına linker tarafından otomatikman eklenen “startup-code' adlı kısım, programınız çalışınca, daha main( ) adlı ana fonksiyon çağrılmadan önce yaptığı pekçok işin arasında 'exec.library' ve 'dos.library” adlı library'leri açarak kullanıma hazır hale getirir. Yukarıdaki fonksiyonlar da bu library'lere ait oldukları için onları doğrudan doğruya kullanabiliriz. İsterseniz biraz da AmigaBASIC'- ten resident library kullanımı ile ilgili birkaç örnek vereyim. Fakat önce İibrary'lere ait fonksiyonlar hakkında döküman arayanlara bazı kitaplar tevsiye edeceğim, ama ne yazık ki bu kaynakların hepsi yabancı dillerde. Ben henüz library'ler hakkında dilimize çevrilmiş ciddi bir kaynak görmedim, lütfen bulursanız bana da haber verin.