2016-04-21 32 views
1

在eclipse中構建下面的代碼時,我得到的值不會被忽略,因爲它應該是這樣,通常這個錯誤是在我們期待函數返回void。但是在這裏我沒有使用任何函數,我正在使用一個void指針。 代碼如下:MINGW編譯錯誤:void value不應忽略,因爲它應該是

typedef struct MessageName_T 
{ 
MPM_ParameterName_t parameterName; 
uint32_t minRange; 
uint32_t maxRange; 
bool_t isInRange; 
DataType_t dataType; 
bool_t isValueNa; 
void* const data; 
}MessageName_t ; 


MessageName_t messagefr[3] = 
/* Parameter,     Minimum,  Maximum,  isInRange dataType  isValueNa data*/ 
{ 
    { Parameter,    Minimum,  Maximum,  isInRange, dataType,  isValueNa, &stuctureA.data1}, 
    { Parameter1,    Minimum1,  Maximum1,  isInRange1, dataType1, isValueNa1, &stuctureA.data2}, 
    { Parameter2,    Minimum2,  Maximum2,  isInRange2, dataType2, isValueNa2, &stuctureA.data3} 
} 

void rangecheck(int index) 
{ 
    if(messagefr[index].isValueNa == FALSE) 
    { 
    if(*(messagefr[index].data) >= (messagefr[index].minRange) && 
    *(messagefr[index].data) <= (messagefr[index].maxRange)) 
{printf("N"); 
    messagefr[index].messagefr=TRUE; 
} 
else 
{printf("Y"); 
    messagefr[index].isInRange =FALSE; 
} 
} 
else 
{ 
    NOP(); 
} 
} 

在線路*(messagefr[index].data) >= (messagefr[index].minRange)即將到來的錯誤「不忽略,因爲它應該是空值」。 數據是無效的指針,我將其賦值爲&stuctureA.data1。 現在,當訪問數據的這種信息,即*(messagefr[index].data)我收到錯誤,如果我使用(messagefr[index].data)我得到地址分配給數據。

+0

1)對'NOP()'的調用是一個完全不做的事情。建議刪除封閉的'else'代碼塊。 2)字段'isInRange'被定義爲包含'false'或'true',然而,代碼與'FALSE'進行比較3)MessageName_t結構中的幾個字段類型沒有定義。爲了用來爲你調試,發佈的代碼需要覆蓋所有的細節,而不是來自大塊代碼的一些片段。 – user3629249

+0

爲便於我們人類的可讀性和理解:1)遵循以下公理:*每行只有一條語句,並且(最多)每條語句有一個變量聲明* 2)一致地縮進代碼。在每個大括號'{'後縮進。在每個大括號'}'之前取消縮進,建議每個縮進爲4個空格,因爲即使寬度可變的字體也足夠寬。 – user3629249

+0

關於這種線:'messagefr [index] .messagefr = TRUE;',沒有名爲:'messagefr'的字段。建議1)指出哪一行給你提出問題,發佈實際完整的錯誤消息,發佈所有'本地數據'數據類型的定義。 – user3629249

回答

3

在您的代碼中,messagefr[index].data的數據類型爲void *,您無法對其進行取消引用。

您需要先將其轉換爲其他完整類型,然後才能對其進行解析。

考慮到你與minRange東西值進行比較,就像

*(uint32_t *)(messagefr[index].data) 

會工作。


要添加一些闡述關於爲什麼部分,首先讓我們來看看關於完全和不完全類型。引用

...] an object type may be incomplete (lacking sufficient information to determine the size of objects of that type) or complete (having sufficient information).

現在,來到章§6.5.3.2,一元*操作,

The unary * operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object. If the operand has type ‘‘pointer to type’’, the result has type ‘‘type’’. [...]

不過,從章§6.2.5/ 19,我們知道

The void type comprises an empty set of values; it is an incomplete object type that cannot be completed.

因此,指向void的指針無法解除引用,因爲生成的類型(void)不完整,無法確定生成對象所需的大小。所以,我們需要在嘗試解引用之前將指針轉換爲完整類型。

+0

那麼我如何從數據中提取信息或者void * – Huntkil

+1

@ KlasLindbäck現在還好嗎? :) –

+0

謝謝,類型鑄造heped。我還沒有做太多的編碼,只是開始幾件事情,欣賞配合:) – Huntkil

相關問題