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を作成する方法はありますか?