2016-01-31 1 views
1

У меня есть функция:Обобщенный тип массива в параметре функции

void print_sum(int list[], int length) { 
    float sum = 0.0; 
    int i; 
    for (i = 0; i < length; i++) { 
     sum += (float) list[i]; 
    } 
    printf("Sum: %0.2f\n", sum); 
} 

Я хочу, в одной и той же функции, может получать массив int или массив float, например. Как я могу это сделать?

+1

Возможно, вы можете сделать это, используя всевозможные допущения, но не делайте этого. Определите две функции: одну для 'int' и one для 'float' (или 'double's). –

ответ

3

В C++ это можно сделать с помощью шаблона. Но в C вы можете сделать что-то подобное с помощью макросов. Один из способов заключается в замене функции с помощью макроса:

#define PRINT_SUM(list,type,format,length) do{ \ 
     type sum = 0;       \ 
     int i;         \ 
     for (i = 0; i < length; i++) {   \ 
      sum += (type) list[i];    \ 
     }          \ 
     printf("Sum: " format "\n", sum);  \ 
    }while(0) 

Чтобы использовать эту функцию, написать что-то вроде PRINT_SUM(a,float,"%0.2f",3);.

Другой способ определить макрос, который определяет функцию, которая получает список данного типа:

#define DEFINE_PRINT_SUM(name,type,format) void name(type list[], int length) { \ 
    type sum = 0.0;               \ 
    int i;                  \ 
    for (i = 0; i < length; i++) {            \ 
     sum += (type) list[i];             \ 
    }                   \ 
    printf("Sum: "format"\n", sum);           \ 
    }          

Затем вы можете определить версию поплавка print_sum с DEFINE_PRINT_SUM(print_sum_float,float,"%0.2f").

Смежные вопросы