| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1674 人关注过本帖
标题:请问以下函数地址作为函数参数的代码为何总不能通过编译?
只看楼主 加入收藏
shi781203
Rank: 2
来 自:广东省
等 级:论坛游民
帖 子:112
专家分:50
注 册:2011-3-18
结帖率:37.14%
收藏
已结贴  问题点数:20 回复次数:9 
请问以下函数地址作为函数参数的代码为何总不能通过编译?
请问以下函数地址作为函数参数的代码为何总不能通过编译?

Dim x As Integer, y As Integer

Public Function a(x As Integer) As Integer
    a = x
End Function

Public Function b(y As Integer) As Integer
    b = y
End Function

Public Function c(ByVal a As Integer, ByVal b As Integer) As Integer
    c = a + b
End Function

Private Sub Command1_Click()
    Label1.Caption = c(AddressOf a, AddressOf b)
End Sub

Private Sub Form_Load()
    x = 3
    y = 6
End Sub

请高手指点指点……
2016-06-10 13:13
ZHRXJR
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:125
帖 子:1034
专家分:5519
注 册:2016-5-10
收藏
得分:5 
程序代码:
Dim x As Integer, y As Integer

Public Function a() As Integer   '函数仅仅输出a,定义函数类型即可
    a = x
End Function

Public Function b() As Integer   '函数仅仅输出b,定义函数类型即可
    b = y
End Function

Public Function c() As Integer   '函数仅仅输出c,定义函数类型即可
    c = a + b
End Function

Private Sub Command1_Click()
    Label1.Caption = c   '得到c函数的输出
End Sub

Private Sub Form_Load()
    x = 3
    y = 6
End Sub

请不要选我!!!
2016-06-10 16:11
shi781203
Rank: 2
来 自:广东省
等 级:论坛游民
帖 子:112
专家分:50
注 册:2011-3-18
收藏
得分:0 
以下是引用ZHRXJR在2016-6-10 16:11:47的发言:

Dim x As Integer, y As Integer

Public Function a() As Integer   '函数仅仅输出a,定义函数类型即可
    a = x
End Function

Public Function b() As Integer   '函数仅仅输出b,定义函数类型即可
    b = y
End Function

Public Function c() As Integer   '函数仅仅输出c,定义函数类型即可
    c = a + b
End Function

Private Sub Command1_Click()
    Label1.Caption = c   '得到c函数的输出
End Sub

Private Sub Form_Load()
    x = 3
    y = 6
End Sub

你这个无参数代码我一早就做成了,你的回复不是我要的答案,我要的是有参数的函数地址作为函数参数--->用作回调函数之用的!

飞点燃费盐--历史上至有型的计算机病毒(能感染你是我的荣幸,也是你的光荣!)
2016-06-10 23:32
shi781203
Rank: 2
来 自:广东省
等 级:论坛游民
帖 子:112
专家分:50
注 册:2011-3-18
收藏
得分:0 
回复 2楼 ZHRXJR
你的回复并没有出现函数地址作为参数来传递到另一个函数的情况(请你审题后再作答吧!)

飞点燃费盐--历史上至有型的计算机病毒(能感染你是我的荣幸,也是你的光荣!)
2016-06-10 23:55
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
1、AddressOf 只能取得模块中的函数地址,无法取得窗体中函数地址。
2、将函数地址作为函数参数传入只能是long型,计算结果返回也是long型,否则会溢出
因此你的工程文件必须添加一个模块module1,并将函数a、b放进其中,其余的位置不变,修改如下:
'module1代码
Public Function a(x As Integer) As Integer
    a = x
End Function

Public Function b(y As Integer) As Integer
    b = y
End Function

'form代码
Dim x As Integer, y As Integer
Public Function c(ByVal a As Long, ByVal b As Long) As Long
    c = a + b
End Function

Private Sub Command1_Click()
    Label1.Caption = c(AddressOf a, AddressOf b)
End Sub

Private Sub Form_Load()
    x = 3
    y = 6
End Sub


能编个毛线衣吗?
2016-06-11 07:30
shi781203
Rank: 2
来 自:广东省
等 级:论坛游民
帖 子:112
专家分:50
注 册:2011-3-18
收藏
得分:0 
回复 5楼 wmf2014
感谢你的回复,但还遗漏了最后一个问题,就是为何输出结果只是地址相加,而不是地址的值相加?

飞点燃费盐--历史上至有型的计算机病毒(能感染你是我的荣幸,也是你的光荣!)
2016-06-11 10:42
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 6楼 shi781203
vb里调用回调函数需要用到api,目前我还没找到回调函数传递参数的方法,实现你要求的变通方法如下:
'module1中代码
Function a() As Integer
a = Form1.x
End Function
Function b() As Integer
b = Form1.y
End Function

'form1中代码
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public x As Integer, y As Integer
Public Function c(ByVal a As Long, ByVal b As Long) As Long
    c = CallWindowProc(a, 0, 0, 0, 0) + CallWindowProc(b, 0, 0, 0, 0)
End Function

Private Sub Command1_Click()
    Label1.Caption = c(AddressOf a, AddressOf b)
End Sub

Private Sub Form_Load()
    x = 3
    y = 6
End Sub
'运行后会在标签中显示结果9
收到的鲜花
  • 风吹过b2016-06-12 10:56 送鲜花  5朵   附言:很好的参考资料

能编个毛线衣吗?
2016-06-11 12:41
ZHRXJR
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:125
帖 子:1034
专家分:5519
注 册:2016-5-10
收藏
得分:0 
回复 3楼 shi781203
好的,可能没有注意你的提问吧。

请不要选我!!!
2016-06-11 14:10
shi781203
Rank: 2
来 自:广东省
等 级:论坛游民
帖 子:112
专家分:50
注 册:2011-3-18
收藏
得分:0 
以下是引用wmf2014在2016-6-11 12:41:37的发言:

vb里调用回调函数需要用到api,目前我还没找到回调函数传递参数的方法,实现你要求的变通方法如下:
'module1中代码
Function a() As Integer
a = Form1.x
End Function
Function b() As Integer
b = Form1.y
End Function

'form1中代码
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public x As Integer, y As Integer
Public Function c(ByVal a As Long, ByVal b As Long) As Long
    c = CallWindowProc(a, 0, 0, 0, 0) + CallWindowProc(b, 0, 0, 0, 0)
End Function

Private Sub Command1_Click()
    Label1.Caption = c(AddressOf a, AddressOf b)
End Sub

Private Sub Form_Load()
    x = 3
    y = 6
End Sub
'运行后会在标签中显示结果9

'module1中代码
Function a() As String
a = Form1.x
End Function
Function b() As String
b = Form1.y
End Function

'form1中代码
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public x As String, y As String
Public Function c(ByVal aCopy As Long, ByVal bCopy As Long) As String
    c = CallWindowProc(aCopy, 0, 0, 0, 0) & vbCrLf & CallWindowProc(bCopy, 0, 0, 0, 0)
End Function

Private Sub Command1_Click()
    Label1.Caption = c(AddressOf a, AddressOf b)
End Sub

Private Sub Form_Load()
    x = "Very"
    y = "Good"
End Sub
为何运行后会在标签中显示结果只有两个地址值而不是两个字符串的输出?

飞点燃费盐--历史上至有型的计算机病毒(能感染你是我的荣幸,也是你的光荣!)
2016-06-12 00:16
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:15 
回复 9楼 shi781203
你没有看CallWindowProc原型吗?它的返回值是long型,怎么可能返回字符串呢?既然知道返回的值是字符串首地址,当然有办法变成字符串,首先了解vb字符串的存储格式,然后通过读内存的方法转换到指定字符串变量即可。
另:已经搞清楚回调函数如何传递参数,方法是回调函数必须按照指定的规格写形参,如你的a函数应该这样写:
function a(byval x as long,byval x1 as long,byval x2 as long,byval x3 as long) as long  '必须以byval的形式传递4个形参
  a=x
end function

调用回调函数的写法如下:
CallWindowProc addressof a,x,0,0,0  '这样就将x的值传递给回调函数了,很显然可以一次传4个参数过去

能编个毛线衣吗?
2016-06-12 09:54
快速回复:请问以下函数地址作为函数参数的代码为何总不能通过编译?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030720 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved