首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

咨詢:調用FUNCITON時不使用call,則不能返回正確的值.该怎么处理

2012-01-09 
咨詢:調用FUNCITON時不使用call,則不能返回正確的值.PrivateSubCommand1_Click()調用事件Diml_strAsString

咨詢:調用FUNCITON時不使用call,則不能返回正確的值.
Private   Sub   Command1_Click()
'調用事件
        Dim   l_str   As   String
        l_str   =   "Z "
        GetNextString   (l_str)   '此調用不能返回正確的值.
'       Call   GetNextString(l_str)   '此調用能返回正確的值.
        MsgBox   l_str   '輸出 "Z "

End   Sub

Private   Function   GetNextString(ByRef   p_strValue   As   String)   As   Boolean

        p_strValue   =   "0 "

End   Function

在調用function前加上call則可得出正確的結果,   但為什麼一定要加上call呢?   沒有加的時候VB不會報錯,   而且還能正確調用.   但卻不會返回正確的結果.


[解决办法]
Option Explicit

Private Sub Command1_Click()
'調用事件
Dim l_str As String
l_str = "Z "
GetNextString l_str '此調用不能返回正確的值.
' Call GetNextString(l_str) '此調用能返回正確的值.
MsgBox l_str '輸出 "Z "

End Sub

Private Function GetNextString(ByRef p_strValue As String) As Boolean

p_strValue = "0 "

End Function





[解决办法]
Private Sub Command1_Click()
Dim l_str As String
l_str = "Z "
GetNextString l_str '这里不用加括号
MsgBox l_str '輸出 "0 "
End Sub

Private Function GetNextString(ByRef p_strValue As String) As Boolean
p_strValue = "0 "
End Function

[解决办法]
'下面的程序也正常,
Private Sub Command1_Click()
'調用事件
Dim tt As Boolean
Dim l_str As String
l_str = "Z "
tt = GetNextString(l_str) '此調用不能返回正確的值.
MsgBox l_str '輸出 "Z "
End Sub

Private Function GetNextString(ByRef p_strValue As String) As Boolean
p_strValue = "0 "
End Function

[解决办法]
不用call且未接收返回值的时候就不要加括号
加完括号后,byref对l_str就没有效果了
像GetNextString(l_str)这种用法,实际是GetNextString (l_str)
就是说把“(l_str)”作为表达式进行计算,把计算结果传给了GetNextString函数
因此GetNextString函数内部的操作不会影响到l_str
[解决办法]
GetNextString 首先要确定你这个函数的返回值的类型
一般boolean型,直接可以调用,不需call
其它类型:先定义一个变量(与函数返回值类型相同)
for ex:
dim str_AA as string=string.empty
private function GetNextString ( byval str_Test as string) as string

调用时应:str_AA=GetNextString (...)
[解决办法]
调用一个过程时,并不一定要使用 Call 关键字。如果使用 Call 关键字来调用一个需要参数的过程,argumentlist 就必须要加上括号。如果省略了 Call 关键字,那么也必须要省略 argumentlis 外面的括号。如果使用 Call 语法来调用内建函数或用户定义函数,则函数的返回值将被丢弃。
[解决办法]
这个问题本人还真的没有注意过,本人编程从来不使用Call,当然过程的参数部分也从来不去加括号,但这样的问题让我想到了VB.Net,它可是无论如何都会去加括号的,如果遇到同样的情况,不知道在.Net中 过程名(参数) 和 过程名((参数)) 会不会产生不同的结果
[解决办法]
好像没有发生过这个问题啊
[解决办法]
Private Function GetNextString(ByRef p_strValue As String) As Boolean
p_strValue = "0 "



End Function
改为
Private Function GetNextString(p_strValue As String) As Boolean
p_strValue = "0 "
GetNextString=true
End Function

[解决办法]
原因是,加了括号,就当成的按值传递了,而不是把地址传过去
[解决办法]
關注
[解决办法]
对啊,这个问题在MSDN中有明确说明的, 原文如下:

Call 语句


将控制权转移到一个 Sub 过程,Function 过程,或动态连接库 (DLL)过程。

语法

[Call] name [argumentlist]

Call 语句的语法具有以下几个部分:

部分 描述
Call 可选参数;关键字。如果指定了这个关键字,则 argumentlist 必须加上括号,例如:
Call MyProc(0)
name 必要参数,要调用的过程名称。
argumentlist


说明

调用一个过程时,并不一定要使用 Call 关键字。如果使用 Call 关键字来调用一个需要参数的过程,argumentlist 就必须要加上括号。如果省略了 Call 关键字,那么也必须要省略 argumentlis 外面的括号。如果使用 Call 语法来调用内建函数或用户定义函数,则函数的返回值将被丢弃。

若要将整个数组传给一个过程,使用数组名,然后在数组名后加上空括号。


Call 语句示例
下列示例示范如何使用 Call 语句来将控制转移到子过程、内在函数、和动态链接库(DLL)过程,

' 调用一个子过程。
Call PrintToDebugWindow( "Hello World ")
' 上面的语句将控制转移到下面的子过程。
Sub PrintToDebugWindow(AnyString)
Debug.Print AnyString ' 在“立即”窗口中显示。
End Sub

' 调用一个内在函数,函数的返回值被忽略不处理。
Call Shell(AppName, 1) ' AppName 包含可执行文件的路径。

' 调用 Microsoft Windows DLL 过程。该声明语句必需是类模块中的私有的,而不是标准模块中的。
Private Declare Sub MessageBeep Lib "User " (ByVal N As Integer)
Sub CallMyDll()
Call MessageBeep(0) ' 调用 Windows DLL 过程。
MessageBeep 0 ' 再次调用,但不用“调用”这个关键字。
End Sub

热点排行