2015-09-02 91 views
1

我已經做了一個小函數,可以將十六進制顏色值轉換爲c中的rgb值。c pow函數打印錯誤的值,但函數返回正確的結果

功能是否正常工作,如果我通過它「#008080」我得到:

HEX: #008080 RGB: 0, 128, 128 

我遇到的問題是,當我試圖打印()由POW返回的值(調試的目的),這是我所得到的:

EX::: 0 
POWER::: 0.000000 
EX::: 1 
POWER::: 0.000000 
EX::: 0 
POWER::: 0.000000 
EX::: 1 
POWER::: 0.000000 
EX::: 0 
POWER::: 0.000000 
EX::: 1 
POWER::: 0.00000 

這是輸出這個代碼:

int num = 0; 
char c; 
double power; 

for (int i = strlen(hexString), ex = 0; i > 0; i--, ex++) { 
    c = hexString[i - 1]; 
    power = pow(16.0, ex); 
    printf("EX::: %d\n", ex); 
    printf("POWER::: %lf\n", power);  
    num += convertHexCharToDec(&c) * power; 
} 

如果我跑ŧ他與GDB我可以看到,功率變量的值是1,然後是16.

這裏有什麼問題?該函數輸出正確的值,我可以在調試器中看到正確的值,所以爲什麼我看不到正確的值?

感謝

編輯: 增加功率可變型

EDIT2: 搞亂更多一些printfs輸出符後,我發現,我應該使用%F符。

感謝您的幫助。

+4

「power」是「float」還是「double」?如果它是一個浮點數,則需要使用'%f'而不是'%lf'來打印它。 – NiBZ

+0

發佈一個獨立的示例。 –

+1

@NiBZ,no。 'l'對'f'或任何其他浮點說明符都沒有*作用,因爲浮點數被升級爲自動雙精度浮點數。 – paxdiablo

回答

3

您應該首先檢查您沒有顯示的power的類型。

格式說明,並傳遞給printf變量之間的分歧是不確定的行爲,這是爲什麼:

#include <stdio.h> 

int main (void) { 
    int i = 42; 
    double d = 3.14159; 
    printf("POWER::: %lf\n", i); 
    printf("POWER::: %lf\n", d); 
    return 0; 
} 

可以給你:

POWER::: 0.000000 
POWER::: 3.141590 

而不受懲罰。

更詳細的原因爲什麼這些不正確的結果可能發生,請參閱this answer。它並不具體涵蓋浮點值,但理論是相同的。如果你告訴printf期待的一件事,然後給它一個完全不同的事情,如果它成爲:-)

如果power爲整型混淆你也很難抱怨,你需要或者將其更改爲一個非整體式,或更改格式說明符。這種或那種方式,他們應該匹配。


在任何情況下,你不需要求助於浮點在所有的這個任務只要你有一個32位整數(和顏色代碼都是24位)。您可以使用如下代碼:

for (int i = strlen(hexString), mult = 1; i > 0; i--, mult *= 16) { 
    c = hexString[i - 1]; 
    printf("MULT::: %d\n", mult);  
    num += convertHexCharToDec(&c) * mult; 
} 
+0

@paxdiable我已經添加了類型 – AntonioCS