C 指针处增量错误中的左值无效

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

将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)
    {
        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之后,我没有得到任何错误,但语句的含义发生了变化,因为我没有得到正确的结果。您需要取消引用
++
操作的结果,而不是尝试分配给它。