1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
#include <stdarg.h>
#include "test.h"
typedef struct { int x; int y; } Point;
int sum_point_array(int count, ...) {
va_list ap;
va_start(ap, count);
Point *arr = va_arg(ap, Point *);
va_end(ap);
int sum = 0;
for (int i = 0; i < count; i++)
sum += arr[i].x + arr[i].y;
return sum;
}
int sum_array(int count, ...) {
va_list ap;
va_start(ap, count);
int *arr = va_arg(ap, int *);
va_end(ap);
int sum = 0;
for (int i = 0; i < count; i++)
sum += arr[i];
return sum;
}
int sum_float_array(int count, ...) {
va_list ap;
va_start(ap, count);
float *arr = va_arg(ap, float *);
va_end(ap);
float sum = 0;
for (int i = 0; i < count; i++)
sum += arr[i];
return (int)sum;
}
int mix_array_scalar(int count, ...) {
va_list ap;
va_start(ap, count);
int *arr = va_arg(ap, int *);
int extra = va_arg(ap, int);
va_end(ap);
int sum = extra;
for (int i = 0; i < count; i++)
sum += arr[i];
return sum;
}
int main() {
ASSERT(10, ({
int a[] = {1,2,3,4};
sum_array(4, a);
}));
ASSERT(6, ({
float a[] = {1.5, 2.5, 2.0};
sum_float_array(3, a);
}));
ASSERT(20, ({
int a[] = {3,4,5,6};
mix_array_scalar(4, a, 2); // 2 + 3+4+5+6 = 20
}));
ASSERT(21, ({
Point pts[] = {{1,2},{3,4},{5,6}};
sum_point_array(3, pts);
}));
return 0;
}
|