2014-10-26 49 views
0

所以我剛剛瞭解了指針和如何在C中用單獨的函數編寫程序。我將這個華氏轉換成了C語言程序,但是我的編譯器給我一個錯誤:void invalid expression of void expression in我的printf的。Celcius用C中的指針指向華氏溫度

我知道這與我的功能fahrenheit_temperature有關。但我看不出如何解決它?我試圖改變功能來加倍,但它不工作。有任何想法嗎?謝謝。

我的代碼:

#include <stdio.h> 

void fahrenheit_temperature(double celcius_temp, double *fahrenheit_temp){ 
    *fahrenheit_temp = (9.0/5.0) * celcius_temp + 32.0; 
} 

int main(void){ 
    double fahrenheit_temp; 

printf("Freezing point: %6.2f F.\n", 
    fahrenheit_temperature(0.0, &fahrenheit_temp)); 

printf("Boiling point: %6.2f F.\n", 
    fahrenheit_temperature(100.0, &fahrenheit_temp)); 

return 0; 
} 

新代碼:

#include <stdio.h> 

void fahrenheit_temperature(double celcius_temp, double *fahrenheit_temp){ 
    *fahrenheit_temp = (9.0/5.0) * celcius_temp + 32.0; 
} 

int main(void){ 
double fahrenheit_temp, celcius_temp; 

printf("Enter degrees celcius: "); 
scanf("%lf", &celcius_temp); 
fahrenheit_temperature(celcius_temp, &fahrenheit_temp); 
printf("The converted temperature is: %f\n", fahrenheit_temp); 

return 0; 
} 
+1

這看起來好多了,你其實用ARE指針正確在你的函數 – Grantly 2014-10-26 14:54:45

回答

1

你有一個變量,所以用這樣的printf中的變量:

#include <stdio.h> 

void fahrenheit_temperature(double celcius_temp, double *fahrenheit_temp){ 
    *fahrenheit_temp = (9.0/5.0) * celcius_temp + 32.0; 
} 

int main(void){ 
    double fahrenheit_temp; 

fahrenheit_temperature(0.0, &fahrenheit_temp); 
printf("Freezing point: %6.2f F.\n",fahrenheit_temp); 

fahrenheit_temperature(100.0, &fahrenheit_temp); 
printf("Boiling point: %6.2f F.\n",fahrenheit_temp); 

return 0; 
} 

那麼你不需要改變你的函數fahrenheit_temperature的返回類型,但只保留printf語句的函數OUT--因爲它不返回任何值。

1

fahrenheit_temperature回報void所以printf被傳遞void,因此錯誤。

2

fahrenheit_temperature()宣佈爲void因此它不會返回任何內容,因此沒有任何內容傳遞給printf()

返回fahrenheit_temperature()後打印變量fahrenheit_temp。通過fahrenheit_tempprintf()而不是fahrenheit_temperature

然後您可以使用該函數的返回值來指示失敗/誤用。

#include <stdio.h> 
#include <errno.h> 

#define TEMP_C__TO__TEMP_F (temp_c) \ 
    ((9.0/5.0) * (temp_c) + 32.0) 

#define ABSOLUTE_ZERO_TEMP_C (-273.15) 
#define ABSOLUTE_ZERO_TEMP_F TEMP_C__TO__TEMP_F(ABSOLUTE_ZERO_TEMP_C) 
#define INVALID_TEMP_F (ABSOLUTE_ZERO_TEMP_F - 1.) 

int fahrenheit_temperature(double celcius_temp, double *fahrenheit_temp) 
{ 
    int result = 0; 

    if (NULL == fahrenheit_temp) 
    { 
    result = -1; 
    errno = EINVAL; 
    } 
    else if (ABSOLUTE_ZERO_TEMP_C > celcius_temp) /* It cannot be colder then −273.15 C. */ 
    { 
    result = -1; 
    errno = EINVAL; 
    } 
    else 
    { 
    *fahrenheit_temp = ABSOLUTE_ZERO_TEMP_C(celcius_temp); 
    } 

    return result; 
} 

int main(void) 
{ 
    double fahrenheit_temp = INVALID_TEMP_F; 

    if (-1 == fahrenheit_temperature(0.0, &fahrenheit_temp)) 
    { 
    perror("fahrenheit_temperature() failed"); 
    } 
    else 
    { 
    printf("Freezing point: %6.2f F.\n", fahrenheit_temp); 
    } 

    /* Test error case 1: */ 
    fahrenheit_temp = INVALID_TEMP_F; 
    if (-1 == fahrenheit_temperature(0.0, -543.21)) 
    { 
    perror("fahrenheit_temperature() failed"); 
    } 
    else 
    { 
    printf("Test 1 failed: invalid value, should not get here: %6.2f F.\n", fahrenheit_temp); 
    } 

    /* Test error case 2: */ 
    fahrenheit_temp = INVALID_TEMP_F; 
    if (-1 == fahrenheit_temperature(0.0, NULL)) 
    { 
    perror("fahrenheit_temperature() failed"); 
    } 
    else 
    { 
    printf("Test 2 failed: invalid value, should not get here: %6.2f F.\n", fahrenheit_temp); 
    } 

    ... 

:-)

+1

我不想在fahrenheit_temperature函數中返回結果,因爲我想使用指針:) 但是我試着實現你在main(I認爲): 這是更好嗎? – 2014-10-26 14:50:08

0

問題是您需要將值傳遞給printf。現在您通過調用函數傳遞void

一個可能的最小修補程序添加return *fahrenheit_temp;

#include <stdio.h> 

double fahrenheit_temperature(double celcius_temp, double *fahrenheit_temp){ 
    *fahrenheit_temp = (9.0/5.0) * celcius_temp + 32.0; 
    return *fahrenheit_temp; 
} 

int main(void){ 
    double fahrenheit_temp; 

    printf("Freezing point: %6.2f F.\n", 
     fahrenheit_temperature(0.0, &fahrenheit_temp)); 

    printf("Boiling point: %6.2f F.\n", 
     fahrenheit_temperature(100.0, &fahrenheit_temp)); 

    return 0; 
} 

或者你可能更喜歡在局部變量使用存儲的值:

#include <stdio.h> 

double fahrenheit_temperature(double celcius_temp, double *fahrenheit_temp){ 
    *fahrenheit_temp = (9.0/5.0) * celcius_temp + 32.0; 
    return *fahrenheit_temp; 
} 

int main(void){ 

    double fahrenheit_temp; 
    fahrenheit_temperature(0.0, &fahrenheit_temp); 
    printf("Freezing point: %6.2f F.\n", fahrenheit_temp); 

    fahrenheit_temperature(100.0, &fahrenheit_temp); 
    printf("Boiling point: %6.2f F.\n", fahrenheit_temp); 

    return 0; 
} 
+0

如果我正確理解指針,我會說在fahrenheit_temperature函數中的返回是不必要的。那是錯的嗎? – 2014-10-26 15:00:28

+0

這是個人喜好和表演的問題。您可能更喜歡第二種解決方案。不過,由於您正在學習指針,因此我發佈了兩種解決方案.. – gmas80 2014-10-26 15:06:25