C 指针处增量错误中的左值无效
将GCC版本3.0更改为4.1后,增量错误中的左值无效C 指针处增量错误中的左值无效,c,ansi,C,Ansi,将GCC版本3.0更改为4.1后,增量错误中的左值无效 #include <vscreen.h> #include "vscreen_internal.h" extern UDINT colPalette[256]; void memset_f(void *p,USINT value, UDINT len) { register UDINT longValue = colPalette[value]; while(len) { i
#include <vscreen.h>
#include "vscreen_internal.h"
extern UDINT colPalette[256];
void memset_f(void *p,USINT value, UDINT len)
{
register UDINT longValue = colPalette[value];
while(len)
{
if ( ((UDINT)p&3) == 0 ) /* even address*/
{
if (len > 32) /*and more than 32 bytes to fill */
{
*((UDINT*)p)++ = longValue; /* lvalue in increment error*/
*((UDINT*)p)++ = longValue; /* lvalue in increment error*/
*((UDINT*)p)++ = longValue; /* lvalue in increment error*/
*((UDINT*)p)++ = longValue; /* lvalue in increment error*/
*((UDINT*)p)++ = longValue; /* lvalue in increment error*/
*((UDINT*)p)++ = longValue; /* lvalue in increment error*/
*((UDINT*)p)++ = longValue; /* lvalue in increment error*/
*((UDINT*)p)++ = longValue; /* lvalue in increment error*/
len-=32;
continue;
}
}
*(USINT*)p++ = (USINT)longValue; /* lvalue in increment error*/
len--;
}
}
#endif
#包括
#包括“vscreen_internal.h”
extern UDINT Colpalete[256];
void memset_f(void*p,USINT值,UDINT len)
{
寄存器UDINT longValue=colpalete[value];
while(len)
{
如果((乌迪特)p&3)==0)/*偶数地址*/
{
如果(len>32)/*且要填充的字节数超过32个*/
{
*((UDINT*)p)+=longValue;/*增量错误中的左值*/
*((UDINT*)p)+=longValue;/*增量错误中的左值*/
*((UDINT*)p)+=longValue;/*增量错误中的左值*/
*((UDINT*)p)+=longValue;/*增量错误中的左值*/
*((UDINT*)p)+=longValue;/*增量错误中的左值*/
*((UDINT*)p)+=longValue;/*增量错误中的左值*/
*((UDINT*)p)+=longValue;/*增量错误中的左值*/
*((UDINT*)p)+=longValue;/*增量错误中的左值*/
len-=32;
继续;
}
}
*(USINT*)p++=(USINT)longValue;/*增量错误中的左值*/
蓝--;
}
}
#恩迪夫
强制转换的结果不是“左值”,因此不能增加该值。C从一开始就是这样的,所以您以前的代码一定依赖于一些可疑的非标准扩展。在临时指针(如uint32\u t*
)中使用正确的类型,只需执行*ptr++=…
总的来说,这段代码的状态非常糟糕,需要从头重写,然后仔细检查和分解。我不太清楚它的用途,不知怎么优化到32字节块?因为这会让缓存更快乐?我不相信这个代码是那么有效(不再)
你需要抛弃自制的整数类型,摆脱不必要的复杂*((UDINT*)p++
,摆脱石器时代寄存器
,用if(this)if(that){continue;}else
替换if(that&&that){else
等等。手动循环展开是一个非常古老的东西,现在它通常是一个预先成熟的优化
同样值得注意的是,
*((UDINT*)p)
肯定是一种严格的别名冲突,因此您必须使用专门的编译器选项(如-fno strict aliasing
)来编译它。我希望在源代码中有一条关于这一点的评论,以证明程序员已经考虑过了。强制转换的结果不是“左值”,因此不能增加该值。C从一开始就是这样的,所以您以前的代码一定依赖于一些可疑的非标准扩展。在临时指针(如uint32\u t*
)中使用正确的类型,只需执行*ptr++=…
总的来说,这段代码的状态非常糟糕,需要从头重写,然后仔细检查和分解。我不太清楚它的用途,不知怎么优化到32字节块?因为这会让缓存更快乐?我不相信这个代码是那么有效(不再)
你需要抛弃自制的整数类型,摆脱不必要的复杂*((UDINT*)p++
,摆脱石器时代寄存器
,用if(this)if(that){continue;}else
替换if(that&&that){else
等等。手动循环展开是一个非常古老的东西,现在它通常是一个预先成熟的优化
同样值得注意的是,
*((UDINT*)p)
肯定是一种严格的别名冲突,因此您必须使用专门的编译器选项(如-fno strict aliasing
)来编译它。我希望在源代码中有这样的注释来证明程序员已经考虑过了。你能发布完整的错误消息吗?也许在开始时对局部变量进行一次cast((UDINT*)p)
以确保可读性:i did((UDINT*)p)以及((UDINT)p++)=longValue之后,我没有得到任何错误,但语句的含义发生了变化,因为我没有得到正确的结果。您需要取消引用++
操作的结果,而不是尝试分配给它。您可以发布完整的错误消息吗?可能需要执行强制转换((UDINT*)p)
一次,在开始时将局部变量转换为可读性try:*((UDINT*)p++)=longValue
i did((UDINT*)p)以及((UDINT)p++)=longValue之后,我没有得到任何错误,但语句的含义发生了变化,因为我没有得到正确的结果。您需要取消引用++
操作的结果,而不是尝试分配给它。