float
и int
автоматически преобразуются в C - вы можете назначить одно другому, и единственное, на что следует обратить внимание, это то, что если вы присваиваете слишком большой float для int, то вы получите неопределенное поведение (или, возможно, неопределенный результат, я забыл. В любом случае, это нехорошо).
Итак, ваша powerArgs
функция может быть просто:
float powerArgs(float a, int b) {
// do some stuff and return a value
}
Тогда вы можете назвать его как powerArgs(parmA, parmB)
, хотя parmA
является целым числом.
Редактировать: если вы не можете изменить параметры вызова, вы можете сделать это вместо этого
float powerArgs(int *a, int *b) {
float base = *a;
int exponent = *b;
...
}
Если ваш профессор действительно установил вам код, где функция называется *powerArgs(int *a, int *b)
, то ваш профессор - угроза. Нет веской причины, по которой функция возведения в степень должна возвращать указатель на число с плавающей точкой. Вы можете использовать уродливый обходной путь:
float *powerArgs(int *a, int *b) {
static float result;
...
result = /* the result of the calculation */;
return &result;
}
Проблема в том, что все вызовы powerArgs
используют один и тот же объект result
. static
останавливает его прекращение существования в конце вызова, но совместное использование создаст проблемы в долгосрочной перспективе. Это не хорошая практика, но это может быть лучшим решением поставленной вами проблемы.
С ++ подлое решение:
struct FloatWrapper {
float value;
float operator*() {
return value;
}
FloatWrapper(float f) : value(f) {}
};
FloatWrapper powerArgs(int *a, int *b) {
...
float result = /* whatever */;
...
return result;
}
Возвращает объект класса FloatWrapper по значению, а FloatWrapper перегружает оператор *
. Это означает, что *powerArgs(...)
вычисляет с плавающей точкой, что функция должна была возвращаться по значению в первую очередь, без , не требуя указателя на какое-либо специальное место хранения.
Кстати, вы можете проверить, что делает ваша функция, когда parmB
равно 0.