[C语言] 奇怪的#define

[复制链接]
5048|34
 楼主| fnh02 发表于 2013-12-30 18:01 | 显示全部楼层 |阅读模式
本帖最后由 fnh02 于 2013-12-31 17:19 编辑

#define freq                11059200
#define PWM_limt       (freq/1000*4.2)

#define UART_BAUDRATE_2400_T2   (65536-freq/4/2400)

T2L = UART_BAUDRATE_2400_T2;      //设定定时初值
T2H = UART_BAUDRATE_2400_T2 >> 8; //设定定时初值

上面这两行编译没有问题,可以通过

TL0=  PWM_limt;                    -->这一行也没有提示出错!
         


TH0=  PWM_limt >> 8;   -->这一行出错了   error C193: '>>': bad operand type

好像定义里面有*号 乘法运算表达式的基本上都会出错。
请教一下大大们~!!:funk:

不知道还允许不允许开新的问题...
void CCAP0_Time_SET (u32 i)
    {      
      i += (CCAP0H<<8)|CCAP0L;         //取  CCAP0定时器当前值
      CCAP0L      =  ((u8 *)& i)[3];         //更新CCAP0[3]计数器值L     
      CCAP0H      =  ((u8 *)& i)[2];         //更新CCAP0[2]计数器值H           
      PWM.CCAP0L1 =  ((u8 *)& i)[1];   //更新CCAP0[1]
      PWM.CCAP0H1 =  ((u8 *)& i)[0];   //更新CCAP0[0]  
    }

我想把它做成
void CCAP0_Time_SET (u8 x,u32 i)
    {      
      i += (CCAPxH<<8)|CCAPxL;         //取  CCAPx定时器当前值
      CCAPxL      =  ((u8 *)& i)[3];         //更新CCAPx[3]计数器值L     
      CCAPxH      =  ((u8 *)& i)[2];         //更新CCAPx[2]计数器值H           
      PWM.CCAPxL1 =  ((u8 *)& i)[1];   //更新CCAPx[1]
      PWM.CCAPxH1 =  ((u8 *)& i)[0];   //更新CCAPx[0]  
    }

  不知道怎实现....要不然就要写两个函数了!
 楼主| fnh02 发表于 2013-12-30 18:01 | 显示全部楼层
一下就不见了20分,可怜都没有分了!!!!
 楼主| fnh02 发表于 2013-12-30 18:03 | 显示全部楼层
不知道是展开时出错还是因为里面有*号的问题,,,试了好几个有乘法的基本上都过不了 “bad operand type
 楼主| fnh02 发表于 2013-12-30 18:07 | 显示全部楼层
只要里面没有*号的运算都可以编译通过....真的想不通了!!!
gx_huang 发表于 2013-12-30 18:16 | 显示全部楼层
4.2是浮点数呀!浮点数怎么右移?
是不是这个问题?
as564335sa 发表于 2013-12-30 18:17 | 显示全部楼层
数据太长了吧,数据写成#define (xxx)UL试试
as564335sa 发表于 2013-12-30 18:19 | 显示全部楼层
或者是你的的二个define里涉及到浮点运算了
ytlcainiao 发表于 2013-12-30 19:32 | 显示全部楼层
浮点数是不能右移的。虽然相当于乘除法。
ljzhang2_10 发表于 2013-12-30 19:53 | 显示全部楼层
TL0不是应该是整数么??PWM_limt应该是浮点吧,是不是这里的问题??
 楼主| fnh02 发表于 2013-12-30 20:47 | 显示全部楼层
gx_huang 发表于 2013-12-30 18:16
4.2是浮点数呀!浮点数怎么右移?
是不是这个问题?

试了一下把 4.2变成4好像编译通过了,不知道能不能弄个int取整数的函数?
 楼主| fnh02 发表于 2013-12-30 20:55 | 显示全部楼层
谢谢大家打的确是浮点的问题!
再请教一下大家,如果该表达式我想让它自动取整该如何定义呢?
 楼主| fnh02 发表于 2013-12-30 21:05 | 显示全部楼层
不是把它赋值给一个整数型类型,是直接在#define就实现?
李冬发 发表于 2013-12-30 23:14 | 显示全部楼层

TH0=  PWM_limt_Min >> 8;
换成
TH0=  PWM_limt_Min / 256;

 楼主| fnh02 发表于 2013-12-30 23:22 | 显示全部楼层
李冬发 发表于 2013-12-30 23:14

TH0=  PWM_limt_Min >> 8;
换成

好像也可以,最主要我不是要它除256而是要取它的高位的数!
 楼主| fnh02 发表于 2013-12-30 23:26 | 显示全部楼层
temp=(TH1<<8)|TL1;

temp=TH1;
temp<<=8;
temp+=TL1
计算时间是不一样的
ballack_linux 发表于 2013-12-31 00:01 | 显示全部楼层
明显就是因为浮点数 不能进行位操作嘛   可以强制转换为整数
gx_huang 发表于 2013-12-31 08:31 | 显示全部楼层
C语言里本来就可以强制转换的,(freq/1000*4.2)改为:
((unsigned int)(freq/1000*4.2))
另外,(freq/1000*4.2)的精度不是你想象的,一般改为(freq*4.2/1000),
或者改为整数操作:((unsigned long)freq*42/10000),先放大10倍。整数操作比浮点数快多了。
注意计算不要溢出就可以了。

评论

这是编译时处理的常数,不会在运行时计算的  发表于 2013-12-31 21:52

评分

参与人数 1威望 +1 收起 理由
fnh02 + 1 果然是资深工程师...

查看全部评分

sunhq02 发表于 2013-12-31 08:53 | 显示全部楼层
17楼说得对
yongma62 发表于 2013-12-31 09:27 | 显示全部楼层
浮点数怎么移啊?
luofeng2g 发表于 2013-12-31 10:03 | 显示全部楼层
学到一招
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

53

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部