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..
Hit: 5618
Yazar: guru