[英]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));
}
您正在使用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)
。
#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.