#include <stdio.h>
int ic, cd, dc, ci;
void prepare(int n, char chd, double d, char chi, int i)
{
printf("%p\n%p\n%p\n%p\n%p\n", &n
, &chd
, &d
, &chi
, &i
);
ic = (char*)&chd - (char*)&n;
cd = (char*)&d - (char*)&chd;
dc = (char*)&chi - (char*)&d;
ci = (char*)&i - (char*)χ
}
double sum(int n, ...)
{
if (!ic)
{
prepare(0, '0', 0., '0', 0);
printf("%d %d %d %d\n", ic
, cd
, dc
, ci
); }
char *p = (char*)&n + ic;
double sum = 0;
while (n--)
switch (*p)
{
case 'i':
// printf("%d\n", *(int*)(p += ci));
sum += *(int*)(p += ci);
p += ic;
break;
case 'd':
sum += *(double*)(p += cd);
p += dc;
break;
default:
fputs(stderr
, "Invalid type"); return sum;
}
return sum;
}
int main(void)
{
double x = sum(6, 'i', 1, 'd', 2., 'i', 3, 'd', 4., 'i', 5, 'd', 6.);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgaWMsIGNkLCBkYywgY2k7Cgp2b2lkIHByZXBhcmUoaW50IG4sIGNoYXIgY2hkLCBkb3VibGUgZCwgY2hhciBjaGksIGludCBpKQp7CiAgcHJpbnRmKCIlcFxuJXBcbiVwXG4lcFxuJXBcbiIsICZuLCAmY2hkLCAmZCwgJmNoaSwgJmkpOwoKICBpYyA9IChjaGFyKikmY2hkIC0gKGNoYXIqKSZuOwogIGNkID0gKGNoYXIqKSZkIC0gKGNoYXIqKSZjaGQ7CiAgZGMgPSAoY2hhciopJmNoaSAtIChjaGFyKikmZDsKICBjaSA9IChjaGFyKikmaSAtIChjaGFyKikmY2hpOwp9Cgpkb3VibGUgc3VtKGludCBuLCAuLi4pCnsKICBwcmludGYoIiVkXG4iLCBuKTsKCQogIGlmICghaWMpCiAgewogIAlwcmVwYXJlKDAsICcwJywgMC4sICcwJywgMCk7CiAgCXByaW50ZigiJWQgJWQgJWQgJWRcbiIsIGljLCBjZCwgZGMsIGNpKTsKICAJZmZsdXNoKHN0ZG91dCk7CiAgfQoJCiAgY2hhciAqcCA9IChjaGFyKikmbiArIGljOwogIGRvdWJsZSBzdW0gPSAwOwogIAogIHdoaWxlIChuLS0pCiAgICBzd2l0Y2ggKCpwKQogICAgewogICAgICBjYXNlICdpJzoKICAgICAgICAvLyBwcmludGYoIiVkXG4iLCAqKGludCopKHAgKz0gY2kpKTsKICAgICAgICBzdW0gKz0gKihpbnQqKShwICs9IGNpKTsKICAgICAgICBwICs9IGljOwogICAgICAgIGJyZWFrOwogICAgICAgIAogICAgICBjYXNlICdkJzoKICAgICAgICBzdW0gKz0gKihkb3VibGUqKShwICs9IGNkKTsKICAgICAgICBwICs9IGRjOwogICAgICAgIGJyZWFrOwogICAgICAKICAgICAgZGVmYXVsdDoKICAgICAgICBmcHV0cyhzdGRlcnIsICJJbnZhbGlkIHR5cGUiKTsKICAgIAlyZXR1cm4gc3VtOwogICAgfQoKICByZXR1cm4gc3VtOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgZG91YmxlIHggPSBzdW0oNiwgJ2knLCAxLCAnZCcsIDIuLCAnaScsIDMsICdkJywgNC4sICdpJywgNSwgJ2QnLCA2Lik7CiAgcHJpbnRmKCIlZlxuIiwgeCk7CiAgcmV0dXJuIDA7Cn0=