:
#include <stdio.h>
enum OP{SUM, SUB};
void calc_int(const void *pa, const void *pb, void *pc, enum OP op)
{
switch (op) {
case SUM:
*(int *)pc = *(const int *)pa + *(const int *)pb;
break;
case SUB:
*(int *)pc = *(const int *)pa - *(const int *)pb;
break;
}
}
void calc_double(const void *pa, const void *pb, void *pc, enum OP op)
{
switch (op) {
case SUM:
*(double *)pc = *(const double *)pa + *(const double *)pb;
break;
case SUB:
*(double *)pc = *(const double *)pa - *(const double *)pb;
break;
}
}
void calc(void *pa, void *pb, void *pc, size_t n, size_t size, enum OP op,
void (cb)(const void *, const void *, void *, enum OP))
{
char *a = (char *)pa;
char *b = (char *)pb;
char *c = (char *)pc;
size_t i;
for (i = 0; i < n; i++) {
cb(a, b, c, op);
a += size;
b += size;
c += size;
}
}
int main(void)
{
#define N 3
int ia[N] = {1, 2, 3};
int ib[N] = {4, 5, 6};
int ic[N];
double da[N] = {4., 5., 6.};
double db[N] = {1., 2., 3.};
double dc[N];
int i;
calc(ia, ib, ic, N, sizeof(*ia), SUM, calc_int);
calc(da, db, dc, N, sizeof(*da), SUB, calc_double);
for (i = 0; i < N; i++) {
printf("ic[%d] = %d\n", i, ic[i]);
}
for (i = 0; i < N; i++) {
printf("dc[%d] = %f\n", i, dc[i]);
}
return 0;
}