无忧启动论坛

标题: PECMD 的CALC遇到怪事,高手进 [打印本页]

作者: junyee    时间: 2008-10-18 09:36
标题: PECMD 的CALC遇到怪事,高手进
不多说,

\\ START
_SUB SHELL,W180H220,请勾选,,,
LABE LB1,L5T5W150H17,请勾选
CHEK NUMA,L5T40W70H20,数字  1,call ReadCheck,1
CHEK NUMB,L5T65W70H20,数字  2,call ReadCheck,1
CHEK NUMC,L5T90W70H20,数字  4,call ReadCheck,1
CHEK NUMD,L75T40W70H20,数字  8,call ReadCheck,1
CHEK NUME,L75T65W70H20,数字 16,call ReadCheck,1
ITEM BT1,L15T120W60H18,应用,MESS %CK1% + %CK2%=%BN% \n  %BN% + %CK3% =%BNT% \n %BNT% + %CK4% =%BNTP% \n%BNTP% + %CK5% =%BNTPO% @CALC #OK
CALL ReadCheck
PBAR Pbar1,L5T175W150H10,0
_END
_SUB ReadCheck
  FIND $%NUMA.Check%=1,ENVI CK1=1!ENVI CK1=0
  FIND $%NUMB.Check%=1,ENVI CK2=2!ENVI CK2=0
  FIND $%NUMC.Check%=1,ENVI CK3=4!ENVI CK3=0
  FIND $%NUMD.Check%=1,ENVI CK4=8!ENVI CK4=0
  FIND $%NUME.Check%=1,ENVI CK5=16!ENVI CK5=0
  CALC BN=%CK1% + %CK2%
  CALC BNT=%BN% + %CK3%
  CALC BNTP=%BNT% + %CK4%
  CALC BNTPO=%BNTP% +%CK5%
_END

CALL @SHELL

\\ END

用PECMD Load num.ini 后,弹出窗口,不要去勾任何东西。直接点按钮。第一行算错 0 + 0 =5

大家帮忙看看有哪里写错?
PECMD为最新版本,Windows XP SP3,XP SP2 PE都有这个问题?
作者: yichya    时间: 2008-10-18 12:06
估计是PECMD的BUG吧,0+0=5,直接试也如此。
作者: lxl1638    时间: 2008-10-18 12:38
原帖由 junyee 于 2008-10-18 09:36 发表
\\ START
_SUB SHELL,W180H220,请勾选,,,
  LABE LB1,L5T5W150H17,请勾选
  CHEK NUMA,L5T40W70H20,数字  1,call ReadCheck,1
  CHEK NUMB,L5T65W70H20,数字  2,call ReadCheck,1
  CHEK NUMC,L5T90W70H20,数字  4,call ReadCheck,1
  CHEK NUMD,L75T40W70H20,数字  8,call ReadCheck,1
  CHEK NUME,L75T65W70H20,数字 16,call ReadCheck,1
  ITEM BT1,L15T120W60H18,应用,MESS %CK1% + %CK2%=%BN% \n  %BN% + %CK3% =%BNT% \n %BNT% + %CK4% =%BNTP% \n%BNTP% + %CK5% =%BNTPO% @CALC #OK
  CALL ReadCheck
PBAR Pbar1,L5T175W150H10,0
_END
_SUB ReadCheck
  FIND $%NUMA.Check%=1,ENVI CK1=1!ENVI CK1=0
  FIND $%NUMB.Check%=1,ENVI CK2=2!ENVI CK2=0
  FIND $%NUMC.Check%=1,ENVI CK3=4!ENVI CK3=0
  FIND $%NUMD.Check%=1,ENVI CK4=8!ENVI CK4=0
  FIND $%NUME.Check%=1,ENVI CK5=16!ENVI CK5=0
  CALC BN=%CK1% + %CK2%
  CALC BNT=%BN% + %CK3%
  CALC BNTP=%BNT% + %CK4%
  CALC BNTPO=%BNTP% +%CK5%
_END
CALL @SHELL
\\ END

1、_SUB 是定义窗口命令,在 _SUB 与其匹配的 _END 命令之间,窗口及其控件还没生成,所有与窗口及其控件的变量均未初始化,
    所以上面红色一行 CALL ReadCheck 实际没有意义(NUMx.Check 均未初始化,int 类型可能为0,double 类型不确定)。
2、CALC 命令有前导符"#",可以指定数据按何种类型来处理,你上面的所有数据均应按 int 类型数据处理。
3、行首注释符应是"/"不是"\",你用错了,虽不影响使用。

修改如下,去掉 _SUB 与 _END 之间的 CALL ReadCheck ,数值变量按 int 类型处理,在 CALL 窗口之前将变量初始化:
_SUB InitVarule
  TEAM ENVI CK1=1|ENVI CK2=1|ENVI CK3=1| ENVI CK4=1|ENVI CK5=1
  CALC #BN=%CK1% + %CK2%
  CALC
#BNT=%BN% + %CK3%
  CALC
#BNTP=%BNT% + %CK4%
  CALC
#BNTPO=%BNTP% +%CK5%
_END


_SUB DoBT1
  MESS %CK1%+%CK2%=%BN%\n%BN%+%CK3%=%BNT%\n%BNT%+%CK4%=%BNTP%\n%BNTP%+%CK5%=%BNTPO%@CALC #OK
_END


_SUB SHELL,W180H220,请勾选,,,
  LABE LB1,L5T5W150H17,请勾选
  CHEK NUMA,L5T40W70H20,数字  1,call ReadCheck,1
  CHEK NUMB,L5T65W70H20,数字  2,call ReadCheck,1
  CHEK NUMC,L5T90W70H20,数字  4,call ReadCheck,1
  CHEK NUMD,L75T40W70H20,数字  8,call ReadCheck,1
  CHEK NUME,L75T65W70H20,数字 16,call ReadCheck,1
  ITEM BT1,L15T120W60H18,应用,CALL DoBT1
  PBAR Pbar1,L5T175W150H10,0
_END

_SUB ReadCheck
  FIND $%NUMA.Check%=1,ENVI CK1=1!ENVI CK1=0
  FIND $%NUMB.Check%=1,ENVI CK2=2!ENVI CK2=0
  FIND $%NUMC.Check%=1,ENVI CK3=4!ENVI CK3=0
  FIND $%NUMD.Check%=1,ENVI CK4=8!ENVI CK4=0
  FIND $%NUME.Check%=1,ENVI CK5=16!ENVI CK5=0
  CALC #BN=%CK1% + %CK2%
  CALC #BNT=%BN% + %CK3%
  CALC #BNTP=%BNT% + %CK4%
  CALC #BNTPO=%BNTP% +%CK5%
_END

CALL InitVarule
CALL @SHELL

[ 本帖最后由 lxl1638 于 2008-10-18 13:17 编辑 ]
作者: dos时代菜鸟    时间: 2008-10-18 12:59
用 # 表示 数值 运算
作者: lxl1638    时间: 2008-10-18 13:12
原帖由 dos时代菜鸟 于 2008-10-18 12:59 发表
用 # 表示 数值 运算


int 类型整数运算:
CALC #变量=%变量1% 运算符 %变量2%

double 类型运算:
CALC 变量=%变量1% 运算符 %变量2%

字符串运算(连接):
ENVI 变量=%变量1%%变量2%
作者: yichya    时间: 2008-10-18 15:01
DOUBLE类型是什么东西?
作者: mapeimapei    时间: 2008-10-18 15:09
原帖由 yichya 于 2008-10-18 15:01 发表
DOUBLE类型是什么东西?


双精度。。。。。。。
作者: mapeimapei    时间: 2008-10-18 15:10
老九一天够辛苦啊。大家为他的勤劳致敬。。
作者: yichya    时间: 2008-10-18 15:10
原帖由 mapeimapei 于 2008-10-18 15:09 发表


双精度。。。。。。。

还是不明白。。。。。。。
作者: mapeimapei    时间: 2008-10-18 15:17
百度&&google>>double双精度
作者: yichya    时间: 2008-10-18 15:23
在网上大致浏览了一下,大概就是在VB里的Dim xx As Long吧!
这个东西为什么会导致0+0=5这种问题产生呢?

[ 本帖最后由 yichya 于 2008-10-18 15:25 编辑 ]
作者: lxl1638    时间: 2008-10-18 15:29
一个没有初始化的变量,其值可能是不确定的。
如果定义一个变量(不管什么类型变量)以后不对其初始化赋值,读取其地址的首位往往不是0。

上面本人修改过的脚本可以完全达到楼主的要求了,CALC 命令在这个问题上没有BUG,只是功能很有限,无法完成表达式计算。

[ 本帖最后由 lxl1638 于 2008-10-18 15:35 编辑 ]
作者: mapeimapei    时间: 2008-10-18 15:37
原帖由 lxl1638 于 2008-10-18 15:29 发表
一个没有初始化的变量,其值可能是不确定的。
如果定义一个变量(不管什么类型变量)以后不对其初始化赋值,读取其地址的首位往往不是0。



没有初始化变量的,程序会读取内存中那个位置以前存储的数值。。

会出现很多问题的,如:负值。。



作者: mapeimapei    时间: 2008-10-18 15:44
整数有关数据     

   类型                  比特(位)数              取值范围

[signed] int                  16                 -32768~~~32767

Unsigned int                16                  0~~~65535

[signed] short int         16                 -32768~~~32767

Unsigned short int         16                 0~~~65535

long [int]                     32                 -2147483648~~~21474833647

Unsigned long [int]        32                 0~~~4294967295


                浮点型数据
类型                  比特(位)数           有效数据            取值范围 (注:括号中为次方)

float                        32                     6~~~7           -3.4*10*(-38)~~~3.4*10*(38)  
doudle                     64                   15~~~16          -1.7*10*(-308)~~~~1.7*10*(308)
long doudle              128                  18~~~19         -1.2*10*(-4932)~~~1.2*10*(-4932)



[ 本帖最后由 mapeimapei 于 2008-10-18 17:00 编辑 ]
作者: yichya    时间: 2008-10-18 15:45
没怎么学过programming,所以依然不懂……等以后系统的学习C编程的时候再来请教!
作者: junyee    时间: 2008-10-18 16:25
啊,劳驾老九了……

顿时明白!
作者: mapeimapei    时间: 2008-10-18 17:01
回宿舍专门找了C语言书,,呵呵。。需要请浏览14楼。。。




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3