C de Stack Veri Yapısı

Orn.

Bir stack yapisinda; SP:0x46 pStartAdr:0x30 width:4 nSize:4 olsun

Bir eleman koyma islemi gerceklesirken

SP = SP - width seklinde,, yani burada,

SP:0x46 - 4

SP:0x42 yapildiktan sonra memcpy fonksiyonu cagrilip eleman yerlestirilicek.

Bir eleman cekme isleminde ise parametre olarak gelen adrese degeri kopyaladiktan sonra SP width kadar ilerletilir.

SP = SP + width

SP: 0x42 + 4               => SP:0x46

Ve belli bir indeksteki elemana asagidaki fonksiyonla ulasilabilir.

BOOL GetStackIndex(PSTACK lpStack, size_t nIndex, LPDATA lpData)

{

    LPDATA pStart = lpStack->pStartAdr + (lpStack->nSize - ++nIndex) * lpStack->width;

    if(lpStack->SP > pStart)

        return FALSE;

    memcpy(lpData, pStart, lpStack->width);

    return TRUE;

}

Kodu test etme amacli asagidaki gibi bir main fonksiyonu yazilabilir.

int main(int argc, char **argv)

{

    int data, i;

    PSTACK ps = CreateStack(20, sizeof(int));

    for(i = 0;i < 20;i++)

        Push(ps, &i);

    while(Pop(ps, &data))

        printf("%d\n", data);

    CloseStack(ps);

    _getch();

    return EXIT_FAILURE;

}

ISEMPTYSTACK fonksiyonu ise inline bir fonksiyondur.C99 ile dile katilmistir.Makrolar gibi koda yayilabilir.[yayilabilir diyorum cunku derleyici eger kodu sisirebilicegini dusunurse, amac koda normal bir fonksiyonmus gibi yazar.]

Makrolardan daha guvenli ve kullanislidir.

¹Handle w32 programlamada bolca kullanilir.Belli bir duzenle saklanan veri yapisinin tutamac degeridir.Yani bu blogun baslangic adresidir.

Herkese iyi kodlamalar..

Tarih:
Hit: 4468
Yazar: guru



Yorumlar


Siftahı yapan siz olun
Yorum yapabilmek için üye girişi yapmalısınız.