Temel C Programlama -45- Yapı Uygulamaları ,typedef ve union (birlikler)

Daha önceki başlıkta yapılara giriş yapmış ve yapılarla ilgili bilmeniz gerekenleri size aktarmıştık. Burada öncelikle yapılarla basit uygulamalar yapmak istiyorum sonrasında ise typedef tip tanımlayıcısını sizlere açıklayacağım. Şimdi yapı uygulamalarına geçelim.

Basit bir yapı uygulaması

Daha önce bahsettiğimiz gibi bir kutu yapısı oluşturalım ve bu yapı değerleri üzerinde biraz oynama yaparak bunu ekranda gösterelim. Uygulamamız gayet basit olacaktır.

#include <stdio.h>
#include <string.h>
struct kutu 
	{
		int en;
		int boy;
		int yukseklik;
	};
int main()
{
	struct kutu kutu1 = { 10, 15, 30 };
	printf("kutu1 En: %i \n", kutu1.en);
	printf("kutu1 Boy: %i \n", kutu1.boy);
	printf("kutu1 Yukseklik: %i \n", kutu1.yukseklik);

	kutu1.boy = 20;
	kutu1.en = kutu1.en * 2;
	kutu1.yukseklik = 100;

	printf("Veriler Guncellendi \n \n");
	printf("kutu1 En: %i \n", kutu1.en);
	printf("kutu1 Boy: %i \n", kutu1.boy);
	printf("kutu1 Yukseklik: %i \n", kutu1.yukseklik);
}

Burada öncelikle kutu adında bir yapının tanımlaması yapılmaktadır. Daha önce anlattığımız yapının aynısı olarak en, boy ve yukseklik olmak üzere üç adet int tipinde değişken içermektedir. Şimdi main fonksiyonu içerisinde komutların nasıl işletildiklerine göz atalım.

struct kutu kutu1 = { 10, 15, 30 }; Burada kutu tipinde ve kutu1 adında bir yapı değişkeni tanımladık ve ilk değerini sırayla 10, 15 ve 30 olarak verdik. Hangi değerin hangi yapı elemanına denk geldiğini yukarıdaki yapı prototipinden anlıyoruz. Burada değerler en, boy, yukseklik diye sıra ile verilmektedir.

printf(“kutu1 En: %i \n”, kutu1.en); Burada printf() fonksiyonuna argüman olarak kutu1.en ifadesini yazdık. Bildiğiniz üzere yukarıda bunu int en; diye tanımladık. Yani elimizde bir tam sayı var bunun için %i belirtecini kullandık. Dikkat edin burada argüman olarak yapı değeri değil kutu1 yapısının içindeki int tipindeki değişken gidiyor.

kutu1.boy = 20; kutu1 yapı değişkenini tanımlarken buna 10 değerini atamıştık fakat programın herhangi bir yerinde yapı erişim operatörü ile yapı elemanına erişip değerini değiştirebiliriz.

kutu1.en = kutu1.en * 2; Gördüğünüz gibi yapı elemanları üzerinde aritmetik işlemler yapabiliriz ve bunu tekrar yapı elemanlarına atayabiliriz. Yapılar üzerinde çalışmadığımıza dikkat edin.

Programımız çalıştığında ekran görüntüsü şu şekilde olacaktır.

Fonksiyona argüman olarak yapıları aktarmak

Yapıların en güzel yanlarından biri de fonksiyonlara aynı değişkenler gibi argüman olarak aktarılabilmesidir. Üstelik bu argüman olarak aktarma işi oldukça kolay yapılmaktadır. Aynı değişken adı yazar gibi yapı adı yazarak argüman aktarabiliriz. Şimdi yukarıda yazdığımız programı fonksiyonlar vasıtasıyla yapalım.

#include <stdio.h>
#include <string.h>
struct kutu 
	{
		int en;
		int boy;
		int yukseklik;
	};
void yazdir (struct kutu kutu);

int main()
{
	struct kutu kutu1 = { 10, 15, 30 };
	yazdir(kutu1);
}

void yazdir (struct kutu kutu)
{
  	printf("kutu En: %i \n", kutu.en);
	printf("kutu Boy: %i \n", kutu.boy);
	printf("kutu Yukseklik: %i \n", kutu.yukseklik);	
}

Programı çalıştırdığımızda ekran görüntüsü şu şekilde olacaktır.

Burada yapı değerini argüman olarak değeri ile gönderdik. Yani bu fonksiyon orjinal yapı değişkeninin değerlerini kopyalar ve kullanır fakat onun üzerinde değişiklik yapamaz. Eğer yapı dizisi şeklinde veya işaretçi olarak gönderseydik aynı değişkenlerde olduğu gibi referans olarak aktarmış olacak ve değişiklik yapabilecektik.

typedef

Şimdi C ile yazılmış gelişmiş kütüphanelerde gördüğümüz tip tanımlama özelliğine bir göz atalım. Tip tanımlama en yalın anlatımıyla kendi değer tipimizi oluşturma anlamına gelir. Örneğin normalde int, float, char gibi değişken tipleri varken biz uzunluk, led, dugme gibi değişken tipleri oluşturabilir ve bunlarla tanımlama yapabiliriz. Aynı zamanda tip tanımlamayı yapı tiplerinde de kullanabiliriz. Tip tanımlama (typedef) en sık yapı tiplerinde kullanılmaktadır. Tip tanımlamanın ktek bir kullanım sebebi vardır o da kolaylaştırmadır. Şimdi biz yukarıda kutu tipinde bir yapı değişkeni tanımlarken struct kutu kutu1; gibi bir kod yazıyorduk. Yani her tanımlamada struct yazmak zorundayız. Bunu ortadan kaldırmak ve bağımsız bir tip tanımlamak için şöyle bir yol izleriz.

typedef struct {
   int en;
   int boy;
   int yukseklik;
} kutu;

Artık kutu adında bir yapı tipi tanımladığımıza göre bu tipte bir değişken tanımlayabiliriz. Onun için şöyle bir kod yazmamız gerekir.

kutu kutu1;

İstersek typedef özelliğini değişken adlarında da kullanabiliriz. Normalde 8-bitlik veri tipine C dilinde char adı verilir. Ama veri olarak bunun bayt verisi olduğunu biliyoruz. O halde kendimize byte adında bir değişken tipi tanımlayalım.

typedef unsigned char byte;

byte deger1, deger2;

Görüldüğü gibi oldukça basit bir kullanıma sahip. Şimdi union yani birlikler konusundan kısaca bahsedelim ve yapı konusunu bitirelim.

union (birlikler)

union tipi aynı yapı tipine benzese de burada sadece tek bir değişken tanımlanabilmekte ve farklı değişkenler sadece tek bir yapı değişkenini işaret etmektedir. Yani union tipinde bir ana veri tipi tanımlanır ve bunlara farklı değişkenler vasıtasıyla erişilir. Bellekten tasarruf etmek amacıyla kullanılabilir. Birbiriyle alakalı değişkenlerin bir araya getirilmesi gibi düşünebiliriz. O yüzden adı union yani birlik demektir.

union kutu {
   int en;
   int boy;
   int yukseklik;
};

union kutu kutu1, kutu2, kutu3; // üçü de aynı kutu değişkeni demek.

Bir sonraki konuda C dili eğitimlerinde biraz göz ardı edilen ama gömülü sistemlerin olmazsa olmazı olan bit bazlı işlemleri size anlatacağım. Bit bazlı işlemler aynı işaretçiler gibi alt seviye programlamanın olmazsa olmaz parçalarından biridir. Bunun önemini bir sonraki makalede göreceksiniz.

Last updated