Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* das is der "coole" Part, wir haben folgendes:
- (type*)ptr Zuerst wird der Typecast auf "type" evaluiert, damit
- erreichen wir, dass ein ptr +1 (oder ptr++, bzw ++ptr)
- darin endet, dass wir um sizeof(type) weiterverschieben
- ++(type*)ptr Was wir genau jetzt tun... und zwar bevor...
- *(++(type*)ptr) wir den Wert mitteles dereferenzierung zurückgeben
- Hier wird dann auch klar, wieso ein Aufruf von printf("%c", ...) auch ohne
- weitere Argumente funktioniert: es wird einfach die nächste (um char)
- verschobene Adresse vom Stack ausglesen (hinter dem Formatstring im Stack).
- Bei printf() und scanf() werden die Format strings dazu verwendet,
- destzustellen, was wann gelesen wird, aber es sollte alles mit diesem
- Macro funktionieren.
- In Ansi/ISO C gibt es hierfür den header <stdarg.h>, der die passende
- Macro-Familie bereitstellt!
- */
- #define NEXT(ptr, type) *(++(type*)ptr)
- double average(int N, ...)
- {
- /* Zeiger auf erstes Element (Anzahl, eig total egal was es ist, aber
- wir brauchen was um auf die richtige Stelle im Stack zu zeigen) */
- void *arg_ptr = &N;
- /* Hilfvariablen, total egal */
- int arg_int, count;
- double avg = 0;
- for (count = 0; count < N; count++) {
- /* Zeiger um sizeof(int) vorschieben und aktuellen Wert zurück geben */
- arg_int = NEXT(arg_ptr, int);
- avg += arg_int;
- }
- avg /= N;
- return avg;
- }
- void main(void)
- {
- double avg;
- /* "Normaler" Aufruf
- 4 = Anzahl, Werte = 5, 10, 3, 20 */
- avg = average(4, 5, 10, 3, 20); /* (5+10+3+20)/4 = 9.5 */
- /* "Geht" aber auch so, gibt nur ein falsches Ergebnis :-) */
- avg = average(4, 5); /* (5+?+?+?)/4 = ??? */
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement