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

[复制链接]
16031|92
 楼主| Ryanhsiung 发表于 2012-1-11 16:41 | 显示全部楼层
准确的讲应该有3种情况
1、如果满足条件后要执行的语句没有意义,则在优化时会被忽略(楼主不优化,当然不属于这种情况)
2、如果定义了变量是1字节的,那么肯定会执行
92500
3、如果是整型,如图
92501
x1=0x55( ...
兰天白云 发表于 2012-1-11 15:41


谢谢LS的解答,我在43L已经测试过了,46L也说明了原因
 楼主| 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位的单片机进行测试, 只要说明了问题就是对的!
李富贵 发表于 2012-1-11 18:25 | 显示全部楼层
这这说明就不对了,另人总不能为了测试这个代码,专门去买一个32位的开发板,
以16位的单片机进行测试, 只要说明了问题就是对的!
Ryanhsiung 发表于 2012-1-11 16:42
他用的是8位的。
 楼主| Ryanhsiung 发表于 2012-1-11 20:24 | 显示全部楼层
他用的是8位的。
李富贵 发表于 2012-1-11 18:25

没注意看
MicroMMU 发表于 2012-1-11 20:29 | 显示全部楼层
if( (Slave_RecBuff[1])  ==  (~Slave_RecBuff[2]))

  //看看能不能进的来


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

加个(uint8) (~Slave_RecBuff[2])强制转换试下.
fe07fe 发表于 2012-1-11 20:42 | 显示全部楼层
本帖最后由 fe07fe 于 2012-1-11 20:43 编辑

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

  // 一直进不来  优化等级最低
简单人c 发表于 2012-1-11 22:36 | 显示全部楼层
原来还有这么一说,学习了。。。
李富贵 发表于 2012-1-11 23:15 | 显示全部楼层
没注意看
Ryanhsiung 发表于 2012-1-11 20:24

我也没开发板,手头只有STM32、LPC17xx,LM3S9bxx的m3的板子。
据说m3和m0指令集差异很大,m3是ARM7的升级版,m0是ARM7的子集,汇编不懂的干活,但是仍然能猜测出你遇到的问题。
李富贵 发表于 2012-1-11 23:27 | 显示全部楼层
加个(uint8) (~Slave_RecBuff[2])强制转换试下.MicroMMU 发表于 2012-1-11 20:29


大姐你的方法可以用。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
李富贵 发表于 2012-1-11 23:31 | 显示全部楼层
IAR也正确了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
李富贵 发表于 2012-1-12 00:01 | 显示全部楼层
c99的整形扩展有没有原文说明哦?
 楼主| Ryanhsiung 发表于 2012-1-12 08:18 | 显示全部楼层
大姐你的方法可以用。


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


昨天已经试过了,验证可以
  谢谢你
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与程序中的两种表达方式进行对比。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lxyppc 发表于 2012-1-12 13:02 | 显示全部楼层
看来很多人没有看编译说明书的习惯
 楼主| Ryanhsiung 发表于 2012-1-12 13:24 | 显示全部楼层
看来很多人没有看编译说明书的习惯
lxyppc 发表于 2012-1-12 13:02

KEIL RealView编译工具(4.0版)编译器用户指南 400多页,我在特定的需求看过特定的几页。
maketree 发表于 2012-1-12 15:29 | 显示全部楼层
软件虽然有bug,但一般是不影响使用的,好好检查下程序或者设置
李富贵 发表于 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啊!你的办法根本就是胡扯么。
jesseli 发表于 2012-1-13 17:08 | 显示全部楼层
3# 李富贵

heh,同意!
suzhwt 发表于 2012-1-13 17:41 | 显示全部楼层
强制转换
fe07fe 发表于 2012-1-13 20:31 | 显示全部楼层
70# 李富贵
瞎扯了吗?你看看这个,0xaa=170。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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