【问题标题】:MINGW compile error: void value not ignored as it ought to beMINGW 编译错误:应忽略的 void 值
【发布时间】:2016-08-14 06:48:50
【问题描述】:

在 Eclipse 中构建以下代码时,我得到的 void 值没有被忽略,通常当我们期望函数返回 void 的值时会遇到此错误。但在这里我没有使用任何函数,我使用的是 void 指针。 代码如下:

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) &gt;= (messagefr[index].minRange) 行中,错误“未按应有的方式忽略空值”即将出现。 数据是空指针,我将其分配为&amp;stuctureA.data1 的值。 现在在访问这些数据信息时,即*(messagefr[index].data),我得到了错误,如果我使用(messagefr[index].data),我得到了分配给数据的地址。

【问题讨论】:

  • 1) 对NOP() 的调用完全是什么都不做。建议删除封闭的else 代码块。 2) 字段isInRange 定义为包含false 或true,但是,代码与FALSE 进行比较 3) MessageName_t 结构中的几个字段类型未定义。为了为您调试,发布的代码需要涵盖所有细节,而不是来自更大代码块的一些 sn-p。
  • 为了便于我们人类阅读和理解:1) 遵循公理:每行只有一个语句,并且(最多)每个语句一个变量声明。 2) 始终如一缩进代码。在每个左大括号 '{' 后缩进。在每个右大括号 '}' 之前取消缩进,建议每个缩进为 4 个空格,因为这足够宽,即使使用可变宽度字体也可以看到。
  • 关于这种行:messagefr[index].messagefr=TRUE;,没有字段名为:messagefr。建议 1) 指出哪一行给您带来了问题,发布实际完整的错误消息,发布所有“本土”数据类型的定义。
  • 结构定义中的这一行:void* const data; 应该是int * data
  • 1)其他部分由于我必须遵循的编码标准而被保留,2) 如果我收到的值为 NA 即 2^n ,则将其与 false bcoz 进行比较,其中 n 是数据类型,然后无需检查它是否在范围内 3) 代码保存在这里的时间太长了,这就是 sn-p 的原因。我正在使用 void* const 数据,因为我得到的信息并不总是 int,它可以是 uint8、uint16、int32、float64 等。因此是 void poonter

标签: c pointers void-pointers dereference mingw32


【解决方案1】:

在你的代码中,messagefr[index].data 的数据类型是void *,你不能取消引用它。

您需要先将其转换为其他完整类型,然后才能解除它的引用。

考虑到您正在将值与minRange 进行比较,类似于

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

会起作用的。


要添加一些关于why 部分的详细说明,首先让我们看看完整类型和不完整类型。引用

...] 对象类型可能是 不完整(缺乏足够的信息来确定该类型对象的大小)或 完整(有足够的信息)。

现在,来到第 §6.5.3.2 章,一元 * 运算符,

一元* 运算符表示间接。如果操作数指向一个函数,则结果为 功能指示符;如果它指向一个对象,则结果是一个左值,指定 目的。如果操作数的类型为 ‘‘pointer to type’’,则结果的类型为 ‘‘type’’。 [...]

但是,从第 §6.2.5/19 章中,我们知道

void 类型包含一组空值;它是一个不完整的对象类型 无法完成。

因此,无法取消引用指向 void 的指针,因为结果类型 (void) 不完整,并且无法确定结果对象所需的大小。因此,在尝试取消引用之前,我们需要将指针转换为完整类型。

【讨论】:

  • 那么我怎样才能从数据或空位中提取信息 *
  • @KlasLindbäck 现在好点了吗? :)
  • 谢谢,键入 cast heped 。我还没有做太多的编码,只是开始做一些事情,感谢你的努力:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多