【问题标题】:c pow with enumerationc pow 带枚举
【发布时间】:2022-01-13 14:56:59
【问题描述】:

我创建了 3 个 void 函数,它们会将给定 pow(int、float 或 double)的结果返回到原点。

#include <assert.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

enum base_type { BASE_TYPE_INT, BASE_TYPE_FLOAT, BASE_TYPE_DOUBLE };

void my_pow_int(int *b, int n) {
    int a = *b;
    *b = pow(a,n);
}

void my_pow_float(float *b, int n) {
    float a = *b;
    *b = powf(a,n);
}

void my_pow_double(double *b, int n) {
    double a = *b;
    *b = pow(a,n);
}

接下来我创建了一个接受 3 个参数的函数,然后决定应该执行上面的哪个函数。

void my_pow(void *b, int n, enum base_type type) {
    if (type == BASE_TYPE_INT){
        *b = my_pow_int(b, n);
    }
    if (type == BASE_TYPE_FLOAT){
        *b = my_pow_float(b, n);
    }
    else{
        *b = my_pow_double(b, n);
    }
}

我现在确实有一个问题,当我给他一个 void 指针时,由于强制转换,它不会编译。我不明白我在这里做错了什么。

【问题讨论】:

  • 旁白:在my_pow_int() 中,*b = pow(a,n); 只能在pow() 较弱或intdouble 更精确时给出近似正确的答案。仅使用 integer 解决方案会更好。

标签: c pointers


【解决方案1】:

您使用正确的指针类型调用取消引用 b 的函数,这些函数不返回任何内容,因此无需在 my_pow 中设置任何内容:

void my_pow(void *b, int n, enum base_type type) {
    if (type == BASE_TYPE_INT){
        my_pow_int(b, n);
    }
    else if (type == BASE_TYPE_FLOAT){
        my_pow_float(b, n);
    }
    else{
        my_pow_double(b, n);
    }
}

【讨论】:

    【解决方案2】:

    第一个问题:你的 my_pow_* 函数返回 void,所以 *b = my_pow... 不起作用。不需要,因为您正在函数中进行就地分配。

    如果你解决了这个问题,你可以把你的函数称为

    double val = 3.0;
    my_pow(&val, 2, BASE_TYPE_DOUBLE);
    

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 2020-08-21
      • 1970-01-01
      相关资源
      最近更新 更多