2016-12-13 5 views
0

stdinからstdoutへの基本データ型の配列をスキャンして出力できるscan_array関数とprint_array関数を作りたいと思います。私がこれまでに得たものCは基本的なデータ型配列をスキャンして印刷する機能を持っています

#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機能は、すべての基本的なタイプのために働く、私はメイン内部ループのための正常であることを確認しました。

print_array関数はINTSでは機能しますが、その他の基本データ型では機能しません。

void double_printer(void *el) 
{ 
    printf("%lf ", * (double *) el); 
} 

そして、それは完璧に動作します:

まず考えたのは、それがこの

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); 
    } 
} 

そしてdouble_printerを作るよりも似fmtを*代わりのconst char型の関数ポインタをとるようにデフprint_array変更しました。

print_array(a, sizeof(double), n, &double_printer); 

しかし、関数ポインタなしでprint_arrayを作成する方法はありますか?

答えて

1

実際には、intに関するいくつかのバグがあります。

入力127 128 255を試してみると、127 -128 -1が返されます。

問題がchar *element, *end;され、その後、*elementと間接参照、それは8ビットのみではなく、doubleの全32ビットについてを読み出します。

私はこのマクロのほうが良い選択だと思っています。あるいは、関数ポインタをqsortとして提供する必要があります。

関連する問題