打印

深受盗版KEIL编译器之苦! 大家有没有同感? 此问题找到原因

[复制链接]
楼主: Ryanhsiung
手机看帖
扫描二维码
随时随地手机跟帖
61
Ryanhsiung|  楼主 | 2012-1-11 16:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
准确的讲应该有3种情况
1、如果满足条件后要执行的语句没有意义,则在优化时会被忽略(楼主不优化,当然不属于这种情况)
2、如果定义了变量是1字节的,那么肯定会执行
92500
3、如果是整型,如图
92501
x1=0x55( ...
兰天白云 发表于 2012-1-11 15:41


谢谢LS的解答,我在43L已经测试过了,46L也说明了原因

使用特权

评论回复
62
Ryanhsiung|  楼主 | 2012-1-11 16:42 | 只看该作者
你水平还不如楼猪呢。
楼猪用的是stdint定义的uint8_t,也就是你的unsigned char。
而且他的单片机是m0,int类型是32位的,unsigned int=uint32_t
i55 发表于 2012-1-11 16:40


这这说明就不对了,另人总不能为了测试这个代码,专门去买一个32位的开发板,
以16位的单片机进行测试, 只要说明了问题就是对的!

使用特权

评论回复
63
李富贵| | 2012-1-11 18:25 | 只看该作者
这这说明就不对了,另人总不能为了测试这个代码,专门去买一个32位的开发板,
以16位的单片机进行测试, 只要说明了问题就是对的!
Ryanhsiung 发表于 2012-1-11 16:42
他用的是8位的。

使用特权

评论回复
64
Ryanhsiung|  楼主 | 2012-1-11 20:24 | 只看该作者
他用的是8位的。
李富贵 发表于 2012-1-11 18:25

没注意看

使用特权

评论回复
65
MicroMMU| | 2012-1-11 20:29 | 只看该作者
if( (Slave_RecBuff[1])  ==  (~Slave_RecBuff[2]))

  //看看能不能进的来


(~Slave_RecBuff[2])这个可能被扩展到32位寄存器了,所以不可能相等。

加个(uint8) (~Slave_RecBuff[2])强制转换试下.

使用特权

评论回复
66
fe07fe| | 2012-1-11 20:42 | 只看该作者
本帖最后由 fe07fe 于 2012-1-11 20:43 编辑

if(Slave_RecBuff[1] == (~Slave_RecBuff[2]))   //注意程序有点后两个括号问题,复制到记事本上就会更明显,如果代码一直在粘贴的话,这是程序问题。

  // 一直进不来  优化等级最低

使用特权

评论回复
67
简单人c| | 2012-1-11 22:36 | 只看该作者
原来还有这么一说,学习了。。。

使用特权

评论回复
68
李富贵| | 2012-1-11 23:15 | 只看该作者
没注意看
Ryanhsiung 发表于 2012-1-11 20:24

我也没开发板,手头只有STM32、LPC17xx,LM3S9bxx的m3的板子。
据说m3和m0指令集差异很大,m3是ARM7的升级版,m0是ARM7的子集,汇编不懂的干活,但是仍然能猜测出你遇到的问题。

使用特权

评论回复
69
李富贵| | 2012-1-11 23:27 | 只看该作者
加个(uint8) (~Slave_RecBuff[2])强制转换试下.MicroMMU 发表于 2012-1-11 20:29


大姐你的方法可以用。


使用特权

评论回复
70
李富贵| | 2012-1-11 23:31 | 只看该作者
IAR也正确了。

无标题f.png (40.12 KB )

无标题f.png

使用特权

评论回复
71
李富贵| | 2012-1-12 00:01 | 只看该作者
c99的整形扩展有没有原文说明哦?

使用特权

评论回复
72
Ryanhsiung|  楼主 | 2012-1-12 08:18 | 只看该作者
大姐你的方法可以用。


92521
李富贵 发表于 2012-1-11 23:27


昨天已经试过了,验证可以
  谢谢你

使用特权

评论回复
73
fe07fe| | 2012-1-12 09:53 | 只看该作者
#include <LPC213X.H>

#include<string.h>
#include <assert.h>
#define uchar unsigned char
#define uint unsigned int  
const unsigned char Slave_RecBuff[]={0,1,0};
int main()
{
PINSEL0=0X00000000;

IO0DIR=1<<0|1<<1|1<<2|1<<3;

IO0SET=1<<0|1<<1|1<<2|1<<3;


if(Slave_RecBuff[1] == (~Slave_RecBuff[2]))   //未进入

IO0CLR= 1<<0;
  else

IO0CLR= 1<<1;

if(Slave_RecBuff[1] == (!Slave_RecBuff[2]))    //进入了

IO0CLR= 1<<2;
  else

IO0CLR= 1<<3;

}

不知楼主是否解决的问题,1取反为-1,取非为零,一切可有取非代替取反。
下图为lpc2138的仿真图控制高低电平,四个端口分两组0.1和2.3与程序中的两种表达方式进行对比。

使用特权

评论回复
74
lxyppc| | 2012-1-12 13:02 | 只看该作者
看来很多人没有看编译说明书的习惯

使用特权

评论回复
75
Ryanhsiung|  楼主 | 2012-1-12 13:24 | 只看该作者
看来很多人没有看编译说明书的习惯
lxyppc 发表于 2012-1-12 13:02

KEIL RealView编译工具(4.0版)编译器用户指南 400多页,我在特定的需求看过特定的几页。

使用特权

评论回复
76
maketree| | 2012-1-12 15:29 | 只看该作者
软件虽然有bug,但一般是不影响使用的,好好检查下程序或者设置

使用特权

评论回复
77
李富贵| | 2012-1-12 21:32 | 只看该作者
#include

#include
#include  
#define uchar unsigned char
#define uint unsigned int  
const unsigned char Slave_RecBuff[]={0,1,0};
fe07fe 发表于 2012-1-12 09:53



你根本没看楼主的帖子,0x55、0xaa啊!你的办法根本就是胡扯么。

使用特权

评论回复
78
jesseli| | 2012-1-13 17:08 | 只看该作者
3# 李富贵

heh,同意!

使用特权

评论回复
79
suzhwt| | 2012-1-13 17:41 | 只看该作者
强制转换

使用特权

评论回复
80
fe07fe| | 2012-1-13 20:31 | 只看该作者
70# 李富贵
瞎扯了吗?你看看这个,0xaa=170。

使用特权

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

本版积分规则