2013-05-03 2 views
2

Я должен заполнить 2 массива функции int и double, используя функцию.Заполнение массивов различными типами данных по 1 функции

Итак, я делаю 2 почти такие же функции, которые отличаются только типом данных.

void fill_double(double* arr,int n) 
{          
    for(int i=0;i<n;i++) 
    { 
    scanf("%lf",&arr[i]); 
    } 
} 

void fill_int(int* arr,int n) 
{        
    for(int i=0;i<n;i++) 
    { 
    scanf("%d",&arr[i]); 
    } 
} 

В: Как сделать 1 общую функцию для заполнения либо int, либо двойных массивов?

+2

Невозможно в C. В C++ существуют [шаблоны] (http://www.cplusplus.com/doc/tutorial/templates/), чтобы решить эту проблему. –

ответ

2
#include <stdio.h> 

typedef enum { Integer, Double } type; 

void fill(type type, void *array, int size){ 
    int i; 
    for(i=0;i<size;i++){ 
     if(type == Integer) 
      scanf("%d", ((int*)array) + i); 
     else 
      scanf("%lf", ((double*)array) + i); 
    } 
} 
int main(void){ 
    double dd[3]; 
    int id[3]; 
    int i; 

    fill(Double, dd, 3); 
    for(i=0;i<3;++i) 
     printf("%f\n", dd[i]); 

    fill(Integer, id, 3); 
    for(i=0;i<3;++i) 
     printf("%d\n", id[i]); 
    return 0; 
} 

макро версия

#include <stdio.h> 

enum { _int, _double }; 
#define type(x) _##x 

#define FILL(T, A, S) do{ char *table[] = {"%d", "%lf" };int i; for(i=0;i<S;++i){scanf(table[type(T)], &A[i]);}}while(0) 

int main(void){ 
    double dd[3]; 
    int id[3]; 
    int i; 

    FILL(double, dd, 3); 
    for(i=0;i<3;++i) 
     printf("%f\n", dd[i]); 

    FILL(int, id, 3); 
    for(i=0;i<3;++i) 
     printf("%d\n", id[i]); 
    return 0; 
} 
0

Один из способов, которым вы могли бы попытаться сделать что-то вроде макросов. Конечно, это не является общим, или обязательно даже отличное решение, но вы могли бы сделать что-то вроде этого:

#define MAKE_FILL_TEMPLATE(type, scan) \ 
    void fill_##type(type *arr, int n) { \ 
     int i;       \ 
     for (i = 0; i < n; i++) {  \ 
      scanf(scan, &arr[i]);  \ 
     }        \ 
    } 

MAKE_FILL_TEMPLATE(int, "%d") 
MAKE_FILL_TEMPLATE(double, "%lf") 

А теперь макрос шаблон будет определить функцию для вас.

Это, как говорится, обычно нахмурило, поскольку читателю трудно следовать и отлаживать.

1

qsort Аналогично в стандартной библиотеке, вам необходимо пройти размер в байтах элементов, а также размер массива. Эта версия возвращает int, например scanf: количество элементов, отсканированных в случае успеха, в противном случае - код ошибки.

int fill_array(void *array, size_t size, size_t count, const char*fmt) { 
    size_t i; 
    char *p = array; 
    for (i = 0; i < count; i++) { 
     int conv = scanf(fmt, p + i * size); 
     if (conv != 1) return conv; 
    } 
    return (int)count; 
} 

Вы можете выполнить макроопределение, чтобы избежать прохода элемента.

#define FILL_ARRAY(a, count, fmt) \ 
    do{\ 
     fill_array((a), sizeof((a)[0]), (count), (fmt));\ 
    } while(0) 
+0

Не могли бы вы написать пример заполнения массива 1-м методом? – serhii