簡體   English   中英

輸入上下的2的冪

[英]Powers of 2 above and below input

我在中間的編程讀數很好,但是使用帶有上下的指針不能給出使用中間找到的正確值。

在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);
  }
}

您需要包括使用pow函數由於您正在參數中獲取值,因此您的返回類型應該為void,並且在這種情況下您無需使用指針,因此您只需要下面的一個值,上面的一個值,因此您只使用一個int ..但是...您可以使用以下方法:

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

您正在使用printfint* ,而不是在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)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM