| 作者 | 主题 |
|---|---|
|
Ken(小释) 侠士 经验值:1878 发帖数:285 精华帖:19 |
楼主
主题:报告组织,发现编译警告,小兵思想活动和实际行为如下,请组织检阅——WinCC C
以前写了个 《单行脚本:让一个按钮翻转一个变量的状态!主要是解决有些朋友问的VBS下的翻转》的帖子,近期出差归来,发现划痕大侠很细心很仔细的发现一个问题。说明划痕大侠是很爱动手的,因为没有动手的人是很少会发现这个警告的。我也很少注意警告,以前经常听人说有10000个waring也不能有1个error。呵呵,所以看waring。
———————————————————————————— Tag为你想翻转的一个Boolean型变量。 C代码如下 SetTagBit("Tag",!GetTagBit("Tag")); //得到Tag的值取非,写回去! VBS代码如下 HMIRunTime.Tags("Tag").Write(Not CBool(HMIRunTime.Tags("Tag").Read)) //得到Tag的值,先转换成Boolean型,再取非,写回去! 说明:VBS里面为什么要多一个步骤CBool()呢?是因为HMIRunTime.Tags("Tag").Read返回的是一个数值,数值的0取反等于-1,数值1取反等于-2。 NOT是一个取反运算!只有操作对象为Boolean型的时候才是取非! 帖子地址如下: http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=5&a_id=856783&s_id=17&num=6#anch quote:以下是引用划痕在2011-10-24 16:39:09的发言: 今天才注意到这个帖子,就简单补充一下: 将Boolean量取反输出的C代码严谨的写法如下 SetTagBit("Tag",(short)!(GetTagBit("Tag"))); //得到Tag的值取非,写回去! 而此语句SetTagBit("Tag",!GetTagBit("Tag"));//在编译过程中会出现警告 仔仔细细的看完划痕的回复,思想活动和动作过程如下: 1.不用编译器,不用环境。我肉眼看上去,百思不得其解,这个逻辑,这个变量长度都不会有错啊! 2.所以我打开了我心爱的VM,快速的Resume了我WinCC 6.2 Sp2 Asian。测试! 3.测试结果 Warning(0011) : conversion may loose information 4.乖乖 还真有报错? 胡乱翻译一下:转换可能丢失信息 我:意思是说这里面涉及到数据类型的转换? 5.仔细一看都是Boolean型的操作啊?等等……Boolean型?我记得很多C编译环境都不支持Boolean啊!我们以前要用Boolean 都是 #define TRUE 1 #define FALSE 0 GetTagBit("Tag")明明白白的写着return type 是BOOL 难道我对它的返回值进行!操作就要报错? 6.再做测试 !GetTagBit("Tag"); 测试结果:没有错误! 7.奇怪了,不急不急 还有半截我们没有测试呢 SetTagBit 先看看它的定义! SetTagBit Function Sets the value of a tag of data type "Binary tag". Syntax BOOL SetTagBit(Tag Tag_Name, short int value); Tag_Name name of the tag value Value of the tag in the data type "short int" 8.乖乖,看见没 看见没人家清清楚楚明明白白的写着 Short Int 短整型啊! 9原来 SetTagBit(Tag, value); 中的value是短整型,这里我们将一个布尔型“隐式”的转换成了一个短整型。就相当于用更大的存储空间存了一个需要空间很小的值。出现了存储空间大小的变换。所以出现警告,但是这个警告完全可以不去纠结它,因为是小到大,不是大到小。不会loose information的! 放心使用! 报告组织思想活动和实际行动汇报完毕! BTW: 划痕大侠 我咋感觉我们认识呢?好像还在哪里一起讨论过问题!好像是PCS7的问题的!
Ken(小释)…西门子自动化技术群16182848
|