您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]为什么BF在操作位域量时会出现这种问... 
本帖共有572个阅读者
发表帖子 发表投票 回复主题
[求助]为什么BF在操作位域量时会出现这种问题???
pigy(论坛新手)
pigy
头衔:社区公民
帮派:无帮无派
帖数:12
金钱:206
积分:14
注册时间:2011/6/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]为什么BF在操作位域量时会出现这种问题???
在VDSP 5.0++ UPDATA10下,测试了一下如下程序。在对宏定义的位域作赋值操作时老是出现"cc0137:  error: expression must be a modifiable lvalue"。请问这是为什么。不对位域操作就可以,难道不能通过这种方式进行赋值?

typedef union _UNITS_FLAG_STRU
{
    struct _UNITS
    {
        char   flag        :   1;          
        char   reserve     :   7;  
    }bits;

    char byte;    
}UNITS_FLAG;

typedef struct _CHANNEL_STRU
{
    char       data1;
    char       data2;
    UNITS_FLAG units;
}CHANNEL;

typedef struct _PARA_STRU
{
    CHANNEL a;
    CHANNEL b;
}PARA;


char  ch1 = 1;
PARA g_para;


#define GET_FLAG  ( (0 == ch1) ? g_para.a.units.bits.flag : g_para.b.units.bits.flag )
#define GET_BYTE  ( (0 == ch1) ? g_para.a.units.byte : g_para.b.units.byte )

int main( void )
{

    g_para.a.units.bits.flag = 0; //这样可以
    GET_FLAG = 0;     //为什么这个不可以?位域不可以这么操作么?因为程序在很多地方要
                      //做判断以确定对a或b的flag进行操作,不想在程序每个地方都用if。。。else做判断。
    GET_BYTE = 0;     //这个就可以
    
    return 0;
}

错误提示:
上传的图片
  20121227211404.jpg [ 11.73 KB 760×112 ] (缩略时请点击查看原图)

 

测试工程:
上传的附件
   201212272110704.zip [ 7.22 KB ]



「该帖子被 pigy 在 2012-12-27 21:10:14 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/12/27 21:02:30
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
GET_FLAG 和GET_BYTE 是一个宏,宏的值是不可以修改的。具体可在帮助文件中搜索cc0137

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/12/28 9:44:19
pigy(论坛新手)
pigy
头衔:社区公民
帮派:无帮无派
帖数:12
金钱:206
积分:14
注册时间:2011/6/10
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
不是哦!GET_BYTE的值是可以改的,编译也正常!就是GET_FLAG不行!而且虽然定义成宏,但是实际返回的是变量啊。我知道CC0137是指左边量是不可修改变量。但是 g_para.a.units.bits.flag和 g_para.b.units.bits.flag都有是可修改的啊!

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/12/28 13:33:21
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

你用这个指令试试:

GET_FLAG ^= 0;  


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/12/30 1:12:31
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159300 Call, 1 Queries, Processed in 0.062500 second(s),