2016-12-13 7 views
0

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?

Antwort

1

Eigentlich hat es einige Fehler in Bezug auf int.

Versuchen Sie Eingabe 127 128 255, sollte 127 -128 -1 zurückgeben.

Das Problem ist char *element, *end;, und dann dereference mit *element, es liest nur 8 Bits, nicht ganze 32 Bits bezüglich double.

Für diesen Fall, ich denke, definieren Sie ein Makro ist eine bessere Option, oder Sie müssen den Funktionszeiger als qsort in c bietet.

Verwandte Themen