VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: VBProFan

[经验技巧] InStr 数值型、布尔型、And 逻辑与,按位与

[复制链接]
发表于 2011-8-28 10:15:23 | 显示全部楼层
正解吗?b是非0非-1的True时,CBool(Not (b))=True,Not CBool(b)=False

点评

9楼图中的UpLoadFile代码在12楼,它返回的怎么可能是非0非-1以外的数?  发表于 2011-8-28 16:21
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-28 14:27:49 | 显示全部楼层
worldy 发表于 2011-8-28 00:14
回复 VBProFan 的帖子

not b 也是按位取反

b 为0,为什么判断时候b会判断为true? 0 不是 false 吗?
  1. '上传文件模块
  2. Public Function UpLoadFile(sIp As String, sRemoteFileName As String, sLocalFileName As String, sUsername As String, sPassword As String) As Boolean
  3.     Dim ret As Boolean
  4.     Dim hOpen As Long
  5.     Dim hConnection As Long
  6.    
  7.     hOpen = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
  8.     If hOpen <> 0 Then
  9.         hConnection = InternetConnect(hOpen, sIp, 0, sUsername, sPassword, 1, INTERNET_FLAG_PASSIVE, 0)
  10.         If hConnection <> 0 Then '连接正常
  11.             ret = FtpPutFile(hConnection, sLocalFileName, sRemoteFileName, 2, 0)
  12.             UpLoadFile = ret
  13.             frmLog.AddLog "FTP上传:" & sLocalFileName & " → " & sRemoteFileName & " 成功"
  14.         Else '无法连接
  15.             UpLoadFile = False
  16.             frmLog.AddLog "用户名或密码错误,或网络故障"
  17.         End If
  18.     Else
  19.         UpLoadFile = False
  20.     End If
  21.    
  22.     InternetCloseHandle hConnection
  23.     InternetCloseHandle hOpen
  24. End Function
复制代码

点评

果然有问题,Dim ret As Boolean …… ret = FtpPutFile() 你的API声名返回值肯定写成As Boolean了,这样在返回的时候VB不会检查是不是0或者-1,你应该写成As Long  发表于 2011-8-28 16:45
回复 支持 反对

使用道具 举报

发表于 2011-8-28 14:49:01 | 显示全部楼层
本帖最后由 worldy 于 2011-8-28 14:50 编辑

回复 VBProFan 的帖子

你是指If hOpen <> 0 Then这个判断吗?如果是:
if hOpen<>0 then 则将红色部分转换为逻辑值(-1或0)

if b then 和if b<>0 then这两个判断是相同的,前者会将b转换为逻辑值

if not b then 和 if not (b<>0) 判断将会不一样,前者对位取反,后者会先对B和a进行比较得出-1或0再位取反

b=0 : 两者的逻辑值是一样,都是True
b<>0: 但b<>-1,两者的逻辑值就不一样,前者还是true(二进制里含有1的位),后者为false
b=-1(&B11111111): 两者逻辑值都为false
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-28 16:18:36 | 显示全部楼层
本帖最后由 VBProFan 于 2011-8-28 16:23 编辑

回复 worldy 的帖子

我的意思是 UpLoadFile 返回的不是 True 就是 False,b 肯定不是 True 就是 False,而不会是 -1 和 0 以外的数,那么为什么 b 和 Not b 都是 True?

再说即使不看 9 楼图中的 UpLoadFile 的代码,单看 b 的定义为 Boolean,即使 UpLoadFile 返回的是非0非-1的其他数,也被隐式类型转化为 -1 的 True 了,不是吗?

点评

C++有bool(全小写)类型,占用1字节,传输到VB里面要写As Byte……  发表于 2011-8-29 14:43
我记得是C/C++本身并没有BOOL类型,BOOL只是用宏定义的INT  发表于 2011-8-28 18:57
例如UpLoadFile 里面的源代码写成UpLoadFile = 某个API函数() 然后那个API声明的返回值写成了As Boolean,就出问题了,因为VB一看都是Boolean类型就懒得检验了……  发表于 2011-8-28 16:44
恐怕很难讲,或许有个API返回值是1,但是API声明写成了As Boolean,就出问题了……  发表于 2011-8-28 16:42
回复 支持 反对

使用道具 举报

发表于 2011-8-28 18:54:37 | 显示全部楼层
回复 VBProFan 的帖子

我觉得你9L的
dim b as boolean
b=cFTP.UpLoadFile(..........)应该改成
b=(cFTP.UpLoadFile(..........)<>0)

但是,我测试,并没有你说的问题,以下代码打印出来的是false,VB确实进行了隐含的将Long转换成了布尔
Private Function aFun() As Long
    aFun = 6
End Function

Private Sub Command1_Click()
    Dim b As Boolean
    dim a as long

    b = aFun
    a=b
    print a  '=-1
    print b '=true
    Print Not b  '=false
    print clng(b)  '=-1

    print val(b)  '=0,奇怪的事情
    print val(not b)  '=0,奇怪的事情
End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-28 20:03:18 | 显示全部楼层
回复 worldy 的帖子

clng 和 val 作用在 b 上结果却不一样,val 函数貌似有问题,对 bool 型的变量输出都是0?

点评

是的,true,false出来都是0  发表于 2011-8-28 20:16
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-28 20:03:31 | 显示全部楼层
acme_pjz  果然有问题,Dim ret As Boolean …… ret = FtpPutFile() 你的API声名返回值肯定写成As Boolean了,这样在返回的时候VB不会检查是不是0或者-1,你应该写成As Long 


对,我的API声明是:
Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, ByVal lpszRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean

但是这样有什么问题呢?不管 FtpPutFile 返回的是什么,ret肯定不是True就是False,UpLoadFile 和 b 也是,b怎么可能会是0和-1以外的数呢?如果b不是0和-1以外的数,b 和 Not b 又怎么可能都是 True 呢?
回复 支持 反对

使用道具 举报

发表于 2011-8-28 20:22:55 | 显示全部楼层
回复 VBProFan 的帖子

我感觉,你还是再测试你9L的代码,是不是你自己弄错了,因为你将b定义了布尔类型,应该不会有b=true Not b=true的问题!
回复 支持 反对

使用道具 举报

发表于 2011-8-28 20:27:58 | 显示全部楼层
本帖最后由 worldy 于 2011-8-28 20:30 编辑
VBProFan 发表于 2011-8-28 20:03
对,我的API声明是:
Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" ( ...


你这个函数声明感觉有问题:
C的原型为
BOOL FtpPutFile(
    IN HINTERNET hFtpSession,
    IN LPCSTR lpszLocalFile,
    IN LPCSTR lpszNewRemoteFile,
    IN DWORD dwFlags,
    IN DWORD dwContext
);//BOOL 应该是int类型,32位

VB的Boolean类型为16位

我曾经在一个返回为void的函数中,错误的声明为 AS LONG结果系统崩溃......弹栈出错

回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-28 23:36:30 | 显示全部楼层
worldy 发表于 2011-8-28 20:27
你这个函数声明感觉有问题:
C的原型为
BOOL FtpPutFile(

嗯,C 语言貌似没有 bool 型,都用 long 来解决。不过这个声明问题还是不能解释我前面提到的灵异事件,明天上班去看看这个灵异事件是不是自动消失了……
回复 支持 反对

使用道具 举报

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

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-6-29 21:46

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表