您的位置:程序门 -> vb -> 基础类



咨詢:調用funciton時不使用call,則不能返回正確的值.


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


咨詢:調用funciton時不使用call,則不能返回正確的值.[已结贴,结贴人:fklyzlwq]
发表于:2007-01-12 11:50:57 楼主
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不會報錯,   而且還能正確調用.   但卻不會返回正確的結果.
发表于:2007-01-12 11:59:551楼 得分:5
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


   

发表于:2007-01-12 12:20:392楼 得分:5
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
发表于:2007-01-12 12:46:433楼 得分:5
'下面的程序也正常,
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
发表于:2007-01-12 12:56:144楼 得分:15
不用call且未接收返回值的时候就不要加括号
加完括号后,byref对l_str就没有效果了
像getnextstring(l_str)这种用法,实际是getnextstring             (l_str)
就是说把“(l_str)”作为表达式进行计算,把计算结果传给了getnextstring函数
因此getnextstring函数内部的操作不会影响到l_str
发表于:2007-01-12 13:11:485楼 得分:0
getnextstring(l_str)
相当于
call   getnextstring(   (l_str)   )

一对括号把l_str“保护”起来了,使得getnextstring内部无法更改l_str的值
发表于:2007-01-12 14:39:566楼 得分:5
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   (...)
发表于:2007-01-12 15:09:137楼 得分:20
调用一个过程时,并不一定要使用   call   关键字。如果使用   call   关键字来调用一个需要参数的过程,argumentlist   就必须要加上括号。如果省略了   call   关键字,那么也必须要省略   argumentlis   外面的括号。如果使用   call   语法来调用内建函数或用户定义函数,则函数的返回值将被丢弃。
发表于:2007-01-12 18:32:558楼 得分:5
这个问题本人还真的没有注意过,本人编程从来不使用call,当然过程的参数部分也从来不去加括号,但这样的问题让我想到了vb.net,它可是无论如何都会去加括号的,如果遇到同样的情况,不知道在.net中   过程名(参数)   和   过程名((参数))   会不会产生不同的结果
发表于:2007-01-13 16:49:079楼 得分:0
yachong(蚜虫)的正解,   謝謝,   再多加一個參數就試出來了.
getnextstring(l_str,   1)   '會報錯.
发表于:2007-01-13 18:15:3810楼 得分:5
好像没有发生过这个问题啊
发表于:2007-01-13 23:26:0511楼 得分:5
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
发表于:2007-01-14 10:58:5212楼 得分:5
原因是,加了括号,就当成的按值传递了,而不是把地址传过去
发表于:2007-01-14 14:32:2013楼 得分:5
關注
发表于:2007-01-15 11:24:0114楼 得分:20
对啊,这个问题在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

发表于:2007-01-15 18:33:3215楼 得分:0
songyaowu
如果使用   call   语法来调用内建函数或用户定义函数,则函数的返回值将被丢弃

這句話原先是有看到的.不過因為我使用的這個函數剛好也有個返回值boolean,就沒有考慮到括號裡面也的是返回值.
基礎太差,汗顏--


快速检索

最新资讯
热门点击