2

我必须使用函数填充 2 个 int 和 double 数组。

所以,我做了 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 和 double 数组?

4

3 回答 3

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;
}
于 2013-05-03T16:30:46.197 回答
1

与标准库中类似qsort,您需要传递元素的字节大小以及数组的大小。此版本返回intlike 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)
于 2013-05-03T16:40:35.923 回答
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")

现在宏模板将为您定义功能。

话虽如此,这通常是不受欢迎的,因为读者很难理解和调试。

于 2013-05-03T16:03:50.203 回答