2以上和以下输入的功率

时间:2014-03-20 03:58:59

标签: c function loops pointers

我在中间编程读数很好但是使用下面和上面的指针并没有给出使用中间找到的正确值。

在for循环中运行时,为什么低于(很可能也高于)负数? 我是否以正确的方式使用指针进行调用?

/*
 *
 *Function pwrTwo has one parameter "middle" it reads the inout from the user 
 *to find below and above
 *
 *the function is used to find the highest power of two below middle
 *and the lowest power of two above middle
 *
 *The function then returns the two values and they are printed in the
 * the main function displayed as below<middle<above
 *
 */

#include <stdio.h>

int pwrTwo(int m, int*above, int*below) {

  int i = 0;
  *above = 0;
  *below = 0;

  for (i = 2; *below < m; i += 1) {
    *below = pow(2, i);
    printf("%d,%d,%d\n", below, m, i); //my check to see if below middle and i are correct
  }

  for (i += 3; *above > m; i -= 1) {
    *above = pow(2, i);
    printf("%d,%d,%d\n", below, m, above); // checking again
  }

  return;
}

int main() {

  int middle = 1;
  int above = 0;
  int below = 0;

  while (middle > 0) {
    printf("Please input a value:");
    scanf("%d", &middle);
    pwrTwo(middle, &above, &below);
    printf("%d<%d<%d\n", below, middle, above);
  }
}

3 个答案:

答案 0 :(得分:2)

您需要包括使用pow功能 由于您在参数中获取值,因此返回类型应为无效, 在这种情况下你不需要使用指针,你只需要一个下面的值,一个上面的值,所以你只需要使用一个int..but ... 你可以用这个:

void pwrTwo(int m, int*above,int*below){
double log2m = log2(m);
*below = pow(2,floor(log2m));
*above = pow(2,ceil(log2m));
}

答案 1 :(得分:0)

您正在printf使用int*而不是int。我很惊讶你的编译器没有给你警告,因为我的编译器给了我关于这个的警告。

当您将指针打印为int时,如果恰好为其存储的地址设置了符号位,您将得到一个负数。

尝试更改

printf("%d,%d,%d\n",below,m,i)

printf("%d,%d,%d\n",*below,m,i)

以及将printf("%d,%d,%d\n",below,m,above)更改为printf("%d,%d,%d\n",*below,m,*above)

答案 2 :(得分:0)

#3是主要问题。

1)缺少#include <math.h>

2)错误匹配的回报。改变

int pwrTwo(int m, int*above, int*below) {
  ...
  return;
}

void pwrTwo(int m, int*above, int*below) {
  ...
  // return;
}

3)printf()

中的错误类型
// printf("%d,%d,%d\n", below, m, i);
printf("%d,%d,%d\n", *below, m, i);
...
// printf("%d,%d,%d\n", below, m, above);
printf("%d,%d,%d\n", *below, m, *above);
...

4)最好从scanf()

检查返回值
// scanf("%d", &middle);
if (scanf("%d", &middle) != 1) Handle_Error();

5)代码可以简化。注意范围错误。

// some_int = pow(2, i);
some_int = 1 << i;