c pow с перечислением

#c #pointers

#c #указатели

Вопрос:

Я создал 3 функции void, которые вернут результат данного pow (int, float или double) в начало координат.

 #include lt;assert.hgt; #include lt;float.hgt; #include lt;math.hgt; #include lt;stdio.hgt; #include lt;stdlib.hgt;  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);  } }  

Теперь у меня есть проблема, что, когда я даю функции указатель на пустоту, она не будет компилироваться из-за приведения. Я не понимаю, что я здесь делаю не так.

Комментарии:

1. В стороне: In my_pow_int() , *b = pow(a,n); может давать приблизительно правильный ответ только тогда, когда pow() он слаб или int имеет большую точность, чем double . Лучше использовать только целочисленное решение.

Ответ №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_* возвращают пустоту, поэтому *b = my_pow... не работает. В этом нет необходимости, так как вы выполняете задание на месте в своих функциях.

Если вы это исправите, вы можете просто вызвать свою функцию как

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