2016-04-21 33 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

相关问题