【问题标题】:Filling the arrays with different data type by 1 function通过 1 个函数填充具有不同数据类型的数组
【发布时间】:2013-04-28 01:47:12
【问题描述】:

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

所以,我做了两个几乎相同的函数,只是数据类型不同。

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 数组?

【问题讨论】:

  • 在 C 中不可能。在 C++ 中,templates 的存在就是为了解决这个问题。

标签: c function types


【解决方案1】:
#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;
}

【讨论】:

    【解决方案2】:

    与标准库中的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)
    

    【讨论】:

    • 你能写一个用第一种方法填充数组的例子吗?
    【解决方案3】:

    您可以尝试执行此类操作的一种方法是使用宏。当然,这不是一个通用的解决方案,甚至不一定是一个很好的解决方案,但您可以这样做:

    #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")
    

    现在宏模板将为您定义函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 2022-11-29
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      • 2015-07-10
      相关资源
      最近更新 更多