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