打印

请问这样写错在哪里?

[复制链接]
1827|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laibour|  楼主 | 2012-1-19 14:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 laibour 于 2012-1-19 14:55 编辑

BYTE_VAL Side[16];
i   = decade*10 + unit;  // i 为一个整形变量
m = i/8;
n  = i%8;
Side[m].bits.bn = 1;

上面第五行报错,MCC18编译;换成这样写:Side[m].bits.b[n] = 1,也同样报错;下面是BYTE_VAL类型的定义:

typedef union _BYTE_VAL
{
    BYTE Val;
    struct
    {
        unsigned char b0:1;
        unsigned char b1:1;
        unsigned char b2:1;
        unsigned char b3:1;
        unsigned char b4:1;
        unsigned char b5:1;
        unsigned char b6:1;
        unsigned char b7:1;
    } bits;
} BYTE_VAL, BYTE_BITS;
沙发
yewuyi| | 2012-1-19 15:38 | 只看该作者
1、typedef 相当于只是生成了一个新类型名称,你需要用类型名定义完变量后,才能使用变量。
2、给你一个例子:
typedef              struct               BYTE_BIT
{     
uchar                bit0:1;
uchar                bit1:1;
}BYTEBIT;
BYTEBIT             sysflag;
#define              KeySingle            sysflag.bit0
则你就可以正常使用KeySingle了。
3、你可以参考以上的例子修改你的代码,这主要还是你对C语言的基本知识不够熟悉造成的问题

使用特权

评论回复
板凳
laibour|  楼主 | 2012-1-19 15:56 | 只看该作者
2# yewuyi
谢谢,我理解你的意思,如果我把上面改为:
#define              KeySingle           Side[m].bits.b0
肯定也能用,跟直接使用Side[m].bits.b0没什么区别,但是我现在是想让Side[m].bits.b0
中最后一个0写成变量的形式,就像你举的例子中:把sysflag.bit0中的bit0写成bitn,n为一个变量,要怎样去实现呢?

使用特权

评论回复
地板
yewuyi| | 2012-1-19 17:26 | 只看该作者
2# yewuyi
谢谢,我理解你的意思,如果我把上面改为:
#define              KeySingle           Side[m].bits.b0
肯定也能用,跟直接使用Side[m].bits.b0没什么区别,但是我现在是想让Side[m].bits.b0
中最后一 ...
laibour 发表于 2012-1-19 15:56


请去看C语言的基础教材,你的想法无法实现。

使用特权

评论回复
5
sytu_chyq| | 2012-1-20 09:29 | 只看该作者
是不是可以这样啊
#define              KeySingle(n)           Side[m].bits.b ## n ##

使用特权

评论回复
6
Ryanhsiung| | 2012-1-20 10:28 | 只看该作者
LS的想法不错!

使用特权

评论回复
7
yewuyi| | 2012-1-20 11:59 | 只看该作者
是不是可以这样啊
#define              KeySingle(n)           Side[m].bits.b ## n ##
sytu_chyq 发表于 2012-1-20 09:29


任何此类操作都是在编译前进行的替代,不会是带参数的函数,如果你明白了这个,就明白什么是对,什么是不对。

使用特权

评论回复
8
sytu_chyq| | 2012-1-20 14:21 | 只看该作者
这样不就行了

使用特权

评论回复
9
yewuyi| | 2012-1-20 15:34 | 只看该作者
使用##也还是连接符而已,不会实现LZ的那种变量的想法

使用特权

评论回复
10
sytu_chyq| | 2012-1-20 15:51 | 只看该作者
那还是直接这样
Side[m].bits.bn = 1;
==>
Side[m].val |= 1 << n;

使用特权

评论回复
11
gregy_cn| | 2012-1-20 20:30 | 只看该作者
10楼的正解
Side[m].val |= 1 << n;
大家都这样写。
如果清零:Side[m].val &= ~(1 << n);
楼主定义的是8个变量,b0~b7,这个定义是编译的时候处理好的,而在Side[m].bits.bn这个中引用需要的是运行时处理,所以错误。

使用特权

评论回复
12
08211004kun| | 2012-1-25 23:46 | 只看该作者
顶楼上

使用特权

评论回复
13
laibour|  楼主 | 2012-1-29 08:38 | 只看该作者
春节回家没来得及回复,10楼的写法应该是一种可行的操作方法,谢谢大家的回答!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

81

帖子

0

粉丝