Hast du für die create und push Funktion konkrete Prototypen vorgegeben, und sehen die so aus, wie du sie gepostet hast?
Deine zweite push-Variante ist schon fast in Ordnung, aber du hast jetzt links ein stack_t Objekt stehen, und versuchst ein stack_t-Pointer zu zuweisen.Du müßtest also rechts noch einmal dereferenzieren.
Außerdem ist top ein Pointer und müßte auch noch dereferenziert werden.
Die ganze Herangehenweise ist wahrscheinlich eher so gemeint.
Jetzt muß man nicht ständig auf das gespeicherte Element casten, und elemsize bekommt eine Bedeutung.
Einen stack_t für stack_t-Objekte würdest du dann mit create(10,sizeof(stack_t)); erstellen.
Code:
....
stack_t *create(int maxlength,int elemsize)
{
stack_t *s;
s = malloc(sizeof *s);
s->size = maxlength;
s->top = malloc(sizeof *s->top);
*s->top = 0;
s->elemsize = elemsize;
s->content = malloc(s->size * s->elemsize);
return s;
}
void push(stack_t *s,void *e)
{
memcpy((char*)s->content + s->elemsize * *s->top,e,s->elemsize);
++*s->top;
}
int main()
{
stack_t *s;
int i;
/* Einen Stack für 10 int erstellen */
s = create(10,sizeof(int));
/* 10 int auf den Stack pushen */
for(i = 0;i < s->size;i++)
push(s,&i);
for(i = 0;i < s->size;i++)
printf("%d\n",*((int*)s->content + i));
return 0;
}
Bei der ganzen Sache stört mich hier eigentlich nur das top ein int-Pointer ist, und nicht ein einfacher int.
Lesezeichen