2012-03-07 40 views
3

在下面的代碼中,當我將一個結構指針指向浮點指針時出現錯誤,但編譯器不會抱怨,如果我改寫別的東西。它爲什麼這樣做?爲什麼我會得到「指針類型的算術是必需的」?

typedef unsigned byte CELbool; 
typedef struct {(...)} Color; 
typedef struct { 
    (...) 
    Color color; 
    CELbool b; 
} Light; 

Light _light; 

void function(float *x) { 
    _light.b = (CELbool)*x; // No error 
    _light.color = (Color)*x; // (!) Used type 'Color' where arithmetic or pointer type is required 
} 

編輯:所以說,我有一個* x是一個指向顏色,那麼這將是獲得該顏色的正確方法?我目前使用Color c = *((Color *)(value)),但我不認爲這是做到這一點的正確方法。

+0

你不會將float *指針*賦值給任何東西;您正在投射'* x',指針的引用對象,其類型爲'float'。 – jwodder 2012-03-07 01:17:04

+2

您正在嘗試將一個浮點數轉換爲一個結構體...... – 2012-03-07 01:17:36

+0

@EdS .:對於我嘗試的不同事物,我遇到了同樣的錯誤,所以我最初並沒有意識到這一點。我試圖將指針轉換爲Color指針,然後對其進行解引用。 – 2012-03-07 01:28:56

回答

7

您所做的轉換不是從指針轉換爲整數或結構,而是從浮點到整數和結構的轉換。表達

(CELbool)*x 

投下的*x(其中,由於xfloat*,是float)成CELBool值,您已定義爲用於一些積分型一個typedef。這種轉換是可以的,因爲C允許在浮點和整數值之間進行轉換,因爲有一種合理的轉換方式。然而,第二轉換是

(Color)*x 

Color是一個結構,和C沒有定義的浮點類型和struct S之間的轉換,就如同它沒有定義整數類型和struct S之間的轉換,因爲在一般來說,沒有合理的方法來做這種轉換。

其原因大約「指針或算術類型所要求的」錯誤是因爲從float鑄造將需要某種類型的float s時,可以轉化成,這將是或者一些實值類型,一個整數類型或指針類型,因爲float s可以轉換爲指針(儘管這樣做是一個非常糟糕的主意!)Color類型的編譯器列表中不會出現合理的東西,因此會出現錯誤。

希望這會有所幫助!

+0

所以說我有一個* x是一個指向Color的指針,那麼得到那個Color的正確方法是什麼?我目前使用*((Color *)(value)),但我不認爲這是正確的方法。 – 2012-03-07 01:20:54

+0

如果'x'確實是指向'Color'的指針,那麼'*(Color *)x'就是獲取它的方法。這表示「將'x'轉換爲指向'Color'的指針,然後對其進行解引用。」那麼,爲什麼'x'如果參數是'float *',真的指向'Color'?這似乎令人擔憂。 – templatetypedef 2012-03-07 01:22:02

+0

'float * value'和'float value []'是一樣的,Color是三個浮點數(r,g,b),簡化爲float value [3]。我的方法實際上會根據另一個參數設置各種東西。我應該使用void *,但最常見的輸入應該是一個浮點數。 – 2012-03-07 01:26:03

相關問題