?
Makros sind nur sinnvoll, wenn man die Grösse nicht mehr angeben muss.
#include <stddef.h>
#include <stdio.h>
#define PRINT_ARRAY(array, spec) do { \
if (sizeof(array)/sizeof((array)[0]) > 0) { \
printf(spec, array[0]); \
size_t PRINT_ARRAY_INTERN_i; \
for (PRINT_ARRAY_INTERN_i = 1; \
PRINT_ARRAY_INTERN_i < \
sizeof(array)/sizeof((array)[0]); \
++PRINT_ARRAY_INTERN_i) { \
printf(" " spec, array[PRINT_ARRAY_INTERN_i]); \
} \
putchar('\n'); \
} \
} while(0)
int main() {
double d[] = { 1.2, 3.4, 5.6 };
int i[] = { 1, 2, 3 };
PRINT_ARRAY(i, "%d" );
PRINT_ARRAY(d, "%.1f");
return 0;
}
@Light: Wie wäre es mit folgender Funktionssignatur?
enum printf_type { PRINTF_TYPE_INT, PRINTF_TYPE_FLOAT, PRINTF_TYPE_CHAR, ... }
void ausgeben(void *array, size_t anz_elm, enum printf_type typ)
{
const char *spec;
size_t elem_size;
switch (typ) {
case PRINTF_TYPE_INT: spec = "%d"; elem_size=sizeof(int); break;
case PRINTF_TYPE_FLOAT: spec = "%f"; elem_size=sizeof(float); break;
case PRINTF_TYPE_CHAR: spec = "%c"; elem_size=sizeof(char); break;
...
}
...
}
...
double d[] = { 1.2, 3.4, 5.6 };
ausgeben(d, 3, PRINTF_TYPE_DOUBLE);