#include <stdio.h>
/* eigener Testtyp (neben double und string s.u.) */
typedef struct {
char name[20];
int alter;
char geschlecht;
} Person;
/* Aktionen für jeden Typ */
void f_double
(double*d
) { printf("%f\n",*d
); } void f_string
(char*d
) { puts(d
); } void f_struct
(Person
*d
) { printf("%s %d %c\n",d
->name
,d
->alter
,d
->geschlecht
); }
/* anonymer Stackelement-Typ */
typedef struct {
void (*f)();
void *d;
} Eintrag;
/* Aktionen für den Stack */
enum{PUSH,POP,PRINTALL};
/* unser Stack-Typ */
typedef struct{
Eintrag (*work)();
int i;
Eintrag eintrag[100];
} Stack;
#define CALL(x) x.f(x.d)
#define doublePUSH(s,p) s.work(&s,PUSH,p,f_double)
#define stringPUSH(s,p) s.work(&s,PUSH,p,f_string)
#define structPUSH(s,p) s.work(&s,PUSH,p,f_struct)
#define DOStack(s,e) s.work(&s,e)
/* alle Stackoperationen in einer Funktion zusammengefasst */
Eintrag work(Stack *this,int e,void*p,void(*f)())
{
switch(e){
case POP: return this->eintrag[--this->i];
case PUSH: { Eintrag e={f,p}; this->eintrag[this->i++]=e;break; }
case PRINTALL: { int i=this->i; while(i--) CALL(this->eintrag[i]);}
}
}
int main()
{
int i;
Eintrag eintrag;
/* Testdaten mit 3 unterschiedlichen Typen bereitstellen */
double d[]={1,2,3};
char *s[]={"s1","s2","s3"};
Person p[]={{"schmidt",47,'m'},{"meier",11,'w'},{"lehmann",12,'m'}};
/* unser Stack-Objekt */
Stack stack={work};
/* Testdaten mit ihren unterschiedlichen Typen in EINEN Stack packen (eigentliche Aufgabe) */
for(i=0;i<3;++i)
doublePUSH(stack,&d[i]),stringPUSH(stack,s[i]),structPUSH(stack,&p[i]);
/* Kontrollausgabe: gesamter Stackinhalt */
DOStack(stack,PRINTALL);
/* Stack einzeln wieder abräumen und dabei jedes Element nochmal kontrollausgeben */
for(i=0;i<9;++i)
eintrag=DOStack(stack,POP),CALL(eintrag);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovKiBlaWdlbmVyIFRlc3R0eXAgKG5lYmVuIGRvdWJsZSB1bmQgc3RyaW5nIHMudS4pICovCnR5cGVkZWYgc3RydWN0IHsKY2hhciBuYW1lWzIwXTsKaW50IGFsdGVyOwpjaGFyIGdlc2NobGVjaHQ7Cn0gUGVyc29uOwoKLyogQWt0aW9uZW4gZsO8ciBqZWRlbiBUeXAgKi8Kdm9pZCBmX2RvdWJsZShkb3VibGUqZCkgeyBwcmludGYoIiVmXG4iLCpkKTsgfQp2b2lkIGZfc3RyaW5nKGNoYXIqZCkgeyBwdXRzKGQpOyB9CnZvaWQgZl9zdHJ1Y3QoUGVyc29uKmQpIHsgcHJpbnRmKCIlcyAlZCAlY1xuIixkLT5uYW1lLGQtPmFsdGVyLGQtPmdlc2NobGVjaHQpOyB9CgovKiBhbm9ueW1lciBTdGFja2VsZW1lbnQtVHlwICovCnR5cGVkZWYgc3RydWN0IHsKdm9pZCAoKmYpKCk7CnZvaWQgKmQ7Cn0gRWludHJhZzsKCi8qIEFrdGlvbmVuIGbDvHIgZGVuIFN0YWNrICovCmVudW17UFVTSCxQT1AsUFJJTlRBTEx9OwoKLyogdW5zZXIgU3RhY2stVHlwICovCnR5cGVkZWYgc3RydWN0ewpFaW50cmFnICgqd29yaykoKTsKaW50IGk7CkVpbnRyYWcgZWludHJhZ1sxMDBdOwp9IFN0YWNrOwoKI2RlZmluZSBDQUxMKHgpIHguZih4LmQpCiNkZWZpbmUgZG91YmxlUFVTSChzLHApIHMud29yaygmcyxQVVNILHAsZl9kb3VibGUpCiNkZWZpbmUgc3RyaW5nUFVTSChzLHApIHMud29yaygmcyxQVVNILHAsZl9zdHJpbmcpCiNkZWZpbmUgc3RydWN0UFVTSChzLHApIHMud29yaygmcyxQVVNILHAsZl9zdHJ1Y3QpCiNkZWZpbmUgRE9TdGFjayhzLGUpIHMud29yaygmcyxlKQoKLyogYWxsZSBTdGFja29wZXJhdGlvbmVuIGluIGVpbmVyIEZ1bmt0aW9uIHp1c2FtbWVuZ2VmYXNzdCAqLwpFaW50cmFnIHdvcmsoU3RhY2sgKnRoaXMsaW50IGUsdm9pZCpwLHZvaWQoKmYpKCkpCnsKICBzd2l0Y2goZSl7CiAgY2FzZSBQT1A6IHJldHVybiB0aGlzLT5laW50cmFnWy0tdGhpcy0+aV07CiAgY2FzZSBQVVNIOiB7IEVpbnRyYWcgZT17ZixwfTsgdGhpcy0+ZWludHJhZ1t0aGlzLT5pKytdPWU7YnJlYWs7IH0KICBjYXNlIFBSSU5UQUxMOiB7IGludCBpPXRoaXMtPmk7IHdoaWxlKGktLSkgQ0FMTCh0aGlzLT5laW50cmFnW2ldKTt9CiAgfQp9CgppbnQgbWFpbigpCnsKICBpbnQgaTsKICBFaW50cmFnIGVpbnRyYWc7CgogIC8qIFRlc3RkYXRlbiBtaXQgMyB1bnRlcnNjaGllZGxpY2hlbiBUeXBlbiBiZXJlaXRzdGVsbGVuICovCiAgZG91YmxlIGRbXT17MSwyLDN9OwogIGNoYXIgKnNbXT17InMxIiwiczIiLCJzMyJ9OwogIFBlcnNvbiBwW109e3sic2NobWlkdCIsNDcsJ20nfSx7Im1laWVyIiwxMSwndyd9LHsibGVobWFubiIsMTIsJ20nfX07CgogIC8qIHVuc2VyIFN0YWNrLU9iamVrdCAqLwogIFN0YWNrIHN0YWNrPXt3b3JrfTsKCiAgLyogVGVzdGRhdGVuIG1pdCBpaHJlbiB1bnRlcnNjaGllZGxpY2hlbiBUeXBlbiBpbiBFSU5FTiBTdGFjayBwYWNrZW4gKGVpZ2VudGxpY2hlIEF1ZmdhYmUpICovCiAgZm9yKGk9MDtpPDM7KytpKQogICAgZG91YmxlUFVTSChzdGFjaywmZFtpXSksc3RyaW5nUFVTSChzdGFjayxzW2ldKSxzdHJ1Y3RQVVNIKHN0YWNrLCZwW2ldKTsKCiAgLyogS29udHJvbGxhdXNnYWJlOiBnZXNhbXRlciBTdGFja2luaGFsdCAqLwogIERPU3RhY2soc3RhY2ssUFJJTlRBTEwpOwoKICAvKiBTdGFjayBlaW56ZWxuIHdpZWRlciBhYnLDpHVtZW4gdW5kIGRhYmVpIGplZGVzIEVsZW1lbnQgbm9jaG1hbCBrb250cm9sbGF1c2dlYmVuICovCiAgZm9yKGk9MDtpPDk7KytpKQogICAgZWludHJhZz1ET1N0YWNrKHN0YWNrLFBPUCksQ0FMTChlaW50cmFnKTsKCiAgcmV0dXJuIDA7Cn0K