【问题标题】:i need a single function which replace func1,2,3,4,5 here我需要一个替换 func1,2,3,4,5 的函数
【发布时间】:2021-04-14 17:33:40
【问题描述】:
    struct setrate {
    int *rate;
    int numrate;
    }

/*func1 assigned lev1 by f1 */
    func1(struct setrate *name, int lev1, int f1)
    {
    name->rate[lev1] = f1;
    }

/*func1 assigned lev1 by f1 and lev2 by f2*/
    func2(struct setrate *name, int lev1, int f1, int lev2, int f2)
    {
    name->rate[lev1] = f1;
    name->rate[lev2] = f2;
    }
/*func1 assigned lev1 by f1 and lev2 by f2 lev3 by f3*/
    func3(struct setrate *name, int lev1, int f1, int lev2, int f2, int lev3, int f3)
    {
    name->rate[lev1] = f1;
    name->rate[lev2] = f2;
    name->rate[lev3] = f3;
    }
/* func4 and func5 */`enter code here`
    main()
    {
    struct setrate *name

    func1(name, 1, 10);
    func2(name, 1 10, 2, 20);
    func2(name, 1 10, 2, 20, 3, 30);
    func4()
    func5()
    }

【问题讨论】:

  • 查找“c ​​variadic functions”
  • func2(name, 1, 10, 2, 20); -> func1(name, 1, 10); func1(name, 2, 20); - 现在你只需要 1 个函数

标签: c function variables struct overriding


【解决方案1】:

除了可变参数函数或宏,另一种选择是使用compound literals 以匿名数组的形式传递数据。下面的示例代码,也修复了发布代码中指针未初始化的问题。

#include <malloc.h>
#include <stdio.h>

typedef struct setrate {
    int *rate;
    int numrate;
} setrate;

void func(setrate *name, int n, int *p)
{
    for(int k = 0; k < n; k++)
        name->rate[k] = *p++;

#ifdef _DEBUG
    printf("n = %d: ", n);
    for(int k = 0; k < n; k++)
        printf(" %d", name->rate[k]);
    printf("\n");
#endif
}

int main()
{
    struct setrate name;
    name.rate = malloc(3 * sizeof(int));

    func(&name, 0, NULL);
    func(&name, 1, (int[]){11});
    func(&name, 2, (int[]){12, 22});
    func(&name, 3, (int[]){13, 23, 33});

    free(name.rate);
    return 0;
}

Output_DEBUG 定义:

n = 0: 
n = 1:  11
n = 2:  12 22
n = 3:  13 23 33

【讨论】:

    【解决方案2】:

    创建一个包含两个成员的结构:

    struct st {
        int lev;
        int f;
    };
    

    并用所需的值初始化这个结构数组,并将这个结构数组连同数组的大小一起传递给函数funcx(),在funcx()中,遍历数组并填充name结构成员。

    您的代码中存在几个问题,例如缺少;、缺少函数参数中的, 等。我将这些都留给您自己找出并修复。但我会指出您代码中的一个严重问题 - 您的代码正在访问未指向任何有效内存的 name 指针,这将导致未定义的行为。

    您不需要将name 作为指向struct setrate 的指针,但需要将内存分配给name 结构的成员rate。此外,当您动态分配内存时,您需要在完成后释放该内存。

    将这些放在一起,实现将是这样的:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct setrate {
        int *rate;
        int numrate;
    };
    
    struct st {
        int lev;
        int f;
    };
    
    void print_val(struct setrate *p) {
        for (int i = 0; i < p->numrate; ++i) {
            printf ("%d ", (p->rate[i]));
        }
        printf ("\n");
    }
    
    void funcx (struct setrate *name, struct st *x, int x_sz) {
        for (int i = 0; i < x_sz; ++i) {
            name->rate[x[i].lev - 1] = x[i].f;
        }
        name->numrate = x_sz;
    }
    
    int main (void) {
        struct setrate name;
    
        name.rate = malloc (sizeof (int) * 3);
        if (name.rate == NULL) {
            exit (EXIT_FAILURE);
        }
    
        struct st x1[1] = {{1, 10}};
        funcx (&name, x1, sizeof(x1)/sizeof(*x1));
        print_val (&name);
    
        struct st x2[2] = {{1, 10}, {2, 20}};
        funcx (&name, x2, sizeof(x2)/sizeof(*x2));
        print_val (&name);
    
        struct st x3[3] = {{1, 10}, {2, 20}, {3, 30}};
        funcx (&name, x3, sizeof(x3)/sizeof(*x3));
        print_val (&name);
    
        free (name.rate);
        return 0;
    }
    

    输出:

    # ./a.out
    10 
    10 20 
    10 20 30 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 2017-01-11
      • 2012-05-07
      • 2022-11-16
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      相关资源
      最近更新 更多