Amiga C

13. Bölüm

Cenker Özkurt

Bu ay ki konumuz structures (yapılar). Daha önce de söylediğim gibi, artık daha çok örnekler üzerinde çalışacağız. Structures, C dilinde öğreneceğimiz son konu. Bu konu da bittikten sonra, daha karmaşık örneklere rahatlıkla girebiliriz. Şu ana kadar öğrendiğimiz konuların çoğu, daha çok C dilini teorik olarak kavramamızı sağladı. Öğrendiğiniz komutların çoğu, size bu konuları anlamanıza yardımcı olmak için verildi. Şimdiye kadar verdiğimiz komutlar, C dilinin temel komutlarıydı. Fakat bildiğiniz gibi biz Amiga'da C yazıyoruz. Yani Amiga'da C dilinden tam olarak yararlanabilmek için, daha Amiga hakkında öğreneceğimiz çok şey var. Diğer bir deyişle şu ana kadar öğrendiğimiz C bilgisi, bizim Amiga sistemine girmemizi sağlayacak düzeydedir. Tabii ki Amiga sistemini tanımak size düşüyor. Bu da, Amiga başında en azından bir Basic diliyle uğraşmakla mümkün. Eğer Amiga sistem bilginiz iyi ise, beni izlemeye devam edin!

STRUCTURES (Yapılar):

C dilinde çok kullanılan struct komutu, yapı anlamına geliyor. Struct, birden fazla değişkeni bir grup ismi altında toplamamıza yarıyor. Bu sayede program içerisindeki değişkenlere, kullanım yerlerini daha rahat ayırt ederek ulaşabiliyoruz. Böylece hem programımızın anlaşılırlığı artıyor, hem de planlarken değişkenleri daha yerli yerinde kullanabiliyoruz. Sonuç olarak yapılar, verilerin daha iyi organize edilmesini sağlıyor.

Yapılar, program içerisinde 'struct' kelimesi olarak geçiyor.

Struct komutunun genel kullanımı,

struct grup ismi {
  değişkenler
};
şeklindedir. Yapıda yer alan değişkenlere üye diyoruz. Herhangi bir değişken ile üye, aynı ismi taşıyabilir. Üyeler de değişkenler gibi her türden olabilir.
struct {........} a,b,c;
Bu satırda, üyeler { } parantezleri içinde verilmiş olsun. Bu parantezlerden sonra gelen a, b ve c değişkenleri, artık bu üyeleri ihtiva etmektedir. Bu değişkenler bir veya birden fazla olabilir. Eğer bir yapı tanımlamasında bu değişkenler verilmezse, bilgisayar bu yapı tanımlaması için hafızasında yer ayırmaz. Yapıya isim verilmemişse, bu isim daha sonra değişkenlerin tarifinde kullanılabilir.

Şimdi aşağıdaki örneğimizi bir inceleyelim; struct canta { int defter; char kitap; float kalem; }; Burada grup ismimiz çanta olarak verilmiş. Defter, kitap ve kalem ise üyeleri oluşturuyor. Görüldüğü gibi bu üyeler farklı türlerde. Üyelerden sonra herhangi bir değişken ismi gelmediğinden, bilgisayar bu yapı tanımlaması için hafızasında bir yer ayırmıyor. Eğer aşağıdaki gibi yazarsak,

struct canta a;
a değişkenin çanta yapısı içinde olduğunu belirtiyoruz. Bundan sonra bilgisayar hafızasında a için bir yer ayrılıyor. Bu ilk tanımlama yapıldıktan sonra da ilk sayısal değerler (initializion);
struct canta a={ 10,5,8.2 };
şeklinde verilebilir. Programda herhangi bir üyeye ulaşmak için;
a.defter
formatı kullanılır. Burada '.' nokta işareti, değişken adıyla üye adını bağlayan operatör olmaktadır. Yapılarda, aşağıda olduğu gibi birden fazla struct içice kullanılabilir.
struct toplam {
  int sıra;
  int masa;
  struct çanta a;
};
Burada çanta içerisindeki üyelere ulaşmak için,
toplam.a.kalem
yazılır. Şimdi struct işlemini daha iyi anlamak için bir örnek daha verelim.
/* Struct Deneme */
struct grup {
 ina a;
 int b;
 char string[10]; 
} d1;

main()
{
 d1.a=10;
 d1.b=12;
 d1.string="0123456789";

 printf("a=%d",d1.a);
 printf("b=%d",d1.b);
 printf("string=%s",string);
}

/* Program sonu */

STRUCTURE ve FONKSİYONLAR:

C dilinde yapıları kullanırken bazı sorunlarla karşılaşıyoruz. Başlıca sorun structure'ların bir blok olarak başka bir yere kopyalanamaması ve bundan dolayı fonksiyonlara aktarılamamasıdır. Bunun çözümü, struct değişkenini pointer olarak belirlemektir. Pointer'larda böyle bir sınırlama yoktur. Zaten bildiğiniz gibi, pointer'lar bir adres taşımaktadır. Bizim de burada yaptığımız, yapının adresini bir pointer'e atarak kullanmak.

Peki şimdi soracaksınız! Bunu pointer olarak değil de direkt olarak yapının adresini kullanarak yapamaz mıyız? Mesela;

struct isim {
  int boy;
  int yas;
};
  
func1()
{
 struct isim p;
 func2(&p); /* sorun yok */
}

 func2(&p) /* Fakat burası fonksiyon kullanımına aykırı */
 struct isim p;
{
 ...
}
Görüldüğü gibi problem açık. Çünkü fonksiyonlar tanımlanırken parametrelerde '&' operatörü kullanılamıyor. Bunun tek çözümü, pointer'lar. İşte bir örnek;
struct isim *p;
*p artık isim yapısının adresini göstermektedir. Artık bu adresi istediğimiz fonksiyona yollayarak isim yapısını kullanabiliriz,
routine(p) 
struct isim *p;
{
 ...
}
Örnekte, routine() fonksiyonuna isim yapısının adresi yollanmış ve bu adres yeniden tanımlanarak yapının değerleri kullanılabilir hale gelmiştir.

Yapılarda, pointer olarak kullanılan değişkenlerin üyelerine;

p->boy;
olarak ulaşılmaktadır. Burada '.' nokta yerine '->' operatörü kullanıldığını görüyorsunuz. Aslında bu ifade şöyle de çalışabilir:
(*p).boy;
Fakat pointer yapılar C dilinde çok sık kullanıldığından, daha basit olan '->' operatörü seçilmiştir.

Şimdi sizlere, Amiga'da Workbench ekranına grafik olarak nasıl ulaşılabildiğini gösteren bir örnek vermek istiyorum. Fakat bu örneği incelerken bilmediğiniz bazı noktalar çıkacaktır. Bunları yeri geldikçe açıklayacağım.

/* WBench Ekranina Cizim */
 #include <exec/types.h>
 #include <graphics/gfxbase.h>
 #include <intuition/intuitionbase.h>
 #include <functions.h>

 struct IntuitionBase *IntuitionBase;
 struct GfxBase *GfxBase;

 struct RastPort *rp;
 struct Screen *screen;

 main()
 {
 IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",0);
 GfxBase=(struct GfxBase *) OpenLibrary("graphics.library",0);

screen=IntuitionBase->ActiveScreen;

 rp=&(screen->RastPort);

 cls();

 CloseLibrary(IntuitionBase);
 CloseLibrary(GfxBase);
 }

 cls()
 {
 SetAPen(rp,0);
 for(y=0;y<200;y++) {
   Move(rp,0,y);
   Draw(rp,640,y);
 }
 }

/* Program sonu */
Bu program sayesinde, WorkBench ekranını silebilirsiniz. Programımız Amiga sistemini kullandığımız ilk program oluyor. Bu nedenle şimdilik anlayamadığınız yerler olacaktır. Verdiğim programı yazarak deneyin ve inceleyin. Programımızın açıklamasını gelecek ay vereceğim. Unutmadan hatırlatmak istiyorum ki, bu programı Aztec-C V3.6'da derleyebilirsiniz. Herhangi bir editör programında programı yazdıktan sonra, prog.c olarak kaydedin ve compile edin. Bu compile işlemlerini daha önceki sayılarımızdan da hatırlayacaksınız. Fakat programınızın çalışması için, bu işlemleri doğru yapmalısınız.

Bu aylık da bu kadar diyorum. Gelecek ay programımızın açıklamasını ve yeni örnek programları vereceğim. C dilindeki temel konularımız burada sona erdi. Artık, daha önce de söylediğim gibi, Amiga-C örnekleri ile C yazımıza devam edeceğiz.

Bol komutlu günler dilerim.