08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

Dizinin bir elemanın byte uzunluğunu yani sizeof değerini alan size_t türünden bir<br />

parametre.<br />

Dizinin elemanlarını karşılaştırma amacıyla kullanılacak bir işlevin başlangıç adresini alan,<br />

işlev göstericisi parametre.<br />

Bir dizinin en büyük elemanının adresini bulan genel işlevin parametrik yapısı şöyle<br />

olabilir:<br />

void *get_max(const void *pArray, size_t size, size_t width, int<br />

(*cmp)(const void *, const void *));<br />

Bu tür işlevlerin tasarımındaki genel yaklaşım şudur:<br />

İşlev herbir dizi elemanının adresini, gösterici aritmetiğinden faydalanarak bulabilir.<br />

Ancak dizi elemanlarının türü bilinmediğinden, işlev dizinin elemanlarının karşılaştırma<br />

işlemini yapamaz. Bu karşılaştırmayı, işlev göstericisi kullanarak işlevi çağıran kod<br />

parçasına yaptırır. İşlevi çağıracak programcı, karşılaştırma işlevinin dizinin herhangi iki<br />

elemanının adresiyle çağrılacağını gözönüne alarak, karşılaştırma işlevini şöyle yazar:<br />

Karşılaştırma işlevi, karşılaştırılacak iki nesnenin adresini alır. İşlevin birinci<br />

parametresine adresi alınan nesne, ikinci parametreye adresi alınan nesneden daha<br />

büyükse, işlev pozitif herhangi bir değere, küçükse negatif herhangi bir değere, bu iki<br />

değer eşitse sıfır değerine geri döner. Bu, standart strcmp işlevinin sunduğu anlaşmadır.<br />

Aşağıdaki programı inceleyin:<br />

#include <br />

#include <br />

#define MAX_NAME_LEN 20<br />

typedef struct tag_Person {<br />

char name[MAX_NAME_LEN];<br />

int no;<br />

}Person;<br />

typedef unsigned char Byte;<br />

void *get_max(const void *parray, size_t size, size_t width, int<br />

(*fp)(const void *, const void *))<br />

{<br />

Byte *pb = (Byte *)parray;<br />

void *pmax = (void *)parray;<br />

size_t k;<br />

}<br />

for (k = 1; k < size; k++)<br />

if (fp(pb + k * width, pmax) > 0)<br />

pmax = pb + k * width;<br />

return pmax;<br />

int cmp_int(const void *vp1, const void *vp2)<br />

{<br />

return *(const int *)vp1 - *(const int *)vp2;<br />

}<br />

int cmp_person_name(const void *vp1, const void *vp2)<br />

{<br />

return strcmp(((const Person *)vp1)->name, ((const Person *)vp2)-<br />

>name);<br />

}<br />

511

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!