Ich möchte die Funktionen scan_array und print_array ausführen, die alle grundlegenden Datentypenarrays von stdin nach stdout scannen und drucken können.C-Funktionen zum Scannen und Drucken eines beliebigen Basisdatentyparrays
Was ich so weit gekommen:
#include<stdio.h>
void scan_array(void* base, size_t size_of_one, size_t n, const char* fmt)
{
char *element, *end;
end = (char *)base + size_of_one * n;
for (element = (char *)base; element < end; element += size_of_one) {
scanf(fmt, element);
}
}
void print_array(void* base, size_t size_of_one, size_t n, const char* fmt)
{
char *element, *end;
end = (char *)base + size_of_one * n;
for (element = (char *)base; element < end; element += size_of_one) {
printf(fmt, *element);
}
}
int main()
{
double a[3];
size_t n = 3;
scan_array(a, sizeof(double), n, "%lf");
int i;
for(i=0; i<n;i++) {
printf("%lf ", a[i]);
}
putchar('\n');
// prints zeros
print_array(a, sizeof(double), n, "%lf ");
return 0;
}
scan_array Funktion für alle Grundtypen funktioniert, ich überprüft, dass mit normalen for-Schleife im Inneren des Haupt.
print_array Funktion funktioniert für INTS, aber nicht für andere grundlegende Datentypen.
erster Gedanke war array_ausgeben def zu ändern, so dass es Funktionszeiger statt const char nimmt * fmt wie diese
void print_array(void* base, size_t size_of_one, size_t n, void (*data_printer)(void *el))
{
char *element, *end;
end = (char *)base + size_of_one * n;
for (element = (char*)base; element < end; element += size_of_one) {
data_printer(element);
}
}
Und als machen double_printer:
void double_printer(void *el)
{
printf("%lf ", * (double *) el);
}
Und es funktioniert perfekt.
print_array(a, sizeof(double), n, &double_printer);
Aber gibt es eine Möglichkeit, print_array ohne Funktionszeiger zu machen?