[VB]是不是可以在函数中调用自己?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[VB]是不是可以在函数中调用自己?相关的知识,希望对你有一定的参考价值。

VB 例如一个用户函数f:

public function f(x as single) as single
...
a = f(a) <--是否能在这里调用f本身?
...
end function

我记得好象不可以,会出错;但这个操作好象是叫"迭代"吧?(记不清了) 如果实现将很好用,该怎样实现呢?
只有一楼正经

234楼都什么菜鸟

参考技术A 可以
但小心,调用自己有可能造成无限循环,所以在过程\函数中要有跳出的语句
参考技术B VB完全可以使用递归算法,在函数体f内可以出现函数f本身,以下求阶乘的程序在VB6通过

Public Function f(x As Integer) As Integer

If x = 1 Then
f = 1
Else
f = x * f(x - 1)
End If

End Function

Private Sub Command1_Click()
MsgBox f(5)

End Sub

如果把f = x * f(x - 1)改成f = x * f(x)或f = x * f(x + 1),明显不合理,但是VB也会通过,但是执行的时候会产生堆栈溢出的错误
参考技术C 楼主提到的这种调用方式叫做递归。

vb不熟悉,不过在大多数现代编程语言中,都可以使用递归调用。可以用来简单的解决某些特殊的问题,比如计算阶乘。但是递归层数太高时,效率会明显降低,因为要用到大量的堆栈操作。
参考技术D 可以使用,您大约记错了。

public function f(x as single) as single
...
if a = 1 then
f = 2
else
f = 0
end if

a = f(a) <--这样a就得2了
...
end function本回答被提问者采纳
第5个回答  2005-10-02 我认为可以,因为万事皆有可能

VB.net编写的dll,供vb6调用时dll中的函数不可见?

我用VB.net编写的dll,勾选了注册COM和程序集COM可见了,生成的dll再用RegAsm注册dll得到tlb文件了,在vb6中成功引用了该tlb库文件,同时,也成功的使用了 Dim Img As New YCImageDo 了,但是,当执行 Img.的时候,Img类里面的任何属性和函数和过程都 是不可见的。请问这问题如何解决?或者哪位帮编译一下呢,该dll的代码全写好了的。
终于自己找到解决方案了:
Imports System.Runtime.InteropServices
<ComVisible(True)>
<ClassInterface(ClassInterfaceType.AutoDual)>
Pubic Class YCImageDo
。。。。。。
End Class

在您的代码中,您已经成功使用了RegAsm命令将DLL注册为COM组件,并在VB6中成功引用了该组件的类型库文件(TLB文件)。此外,您还在VB6代码中声明了一个YCImageDo类型的对象,并成功创建了该对象。
但是,当您尝试使用YCImageDo对象的属性和方法时,却发现这些成员不可见。这可能是因为在编写DLL代码时您没有正确地声明这些成员的可见性。
在VB.NET中,您可以使用"Public"关键字来声明一个类型的成员(属性、方法、过程等)对外可见,而使用"Private"关键字则声明该成员仅在类型内可见。如果您希望YCImageDo类型的成员在VB6代码中可见,则应将这些成员声明为Public类型。
例如,如果您希望YCImageDo类型拥有一个名为"GetImage"的方法,则可以在DLL代码中按如下方式声明该方法:
Public Function GetImage() As String
' 在这里编写方法的代码
End Function
同样,如果您希望YCImageDo类型拥有一个名为"ImagePath"的属性,则可以在DLL代码中按如下方式声明该属性:
Public Property ImagePath As String
参考技术A 一般dll可以通过Declare 语句在模块级用于声明对动态链接库 (DLL) 中的外部过程的引用。

Private Declare Sub myFunc1 Lib “mylib.dll” (ByVal strName As String)

但是,VB.NET,C#.NET创建的DLL是个类库,不能生成标准的 DLL 文件,不能采用declare ()的方式。应该在解决方案资源管理器下的需要引用的项目的引用栏点击鼠标右键–>添加对这个类库[mylib.dll]的引用即可。追问

终于自己找到解决方案了:
Imports System.Runtime.InteropServices

Pubic Class YCImageDo
。。。。。。
End Class

参考技术B 为你的类及函数过程创建一个接口,在VB或者VBA中用接口创建对象,即可以用点操作符,实际上只要COM没有问题,不用接口的话也可以调用的,就是不方便。假设你的类名为img,接口命名为Iimg,在VB中这样定义:
Dim obj as Iimg
set obj=new img
然后用obj.就有提示了。
具体实现
在你COM项目中复制你的类代码然后粘贴一份,把Class改为Interface,删掉所有内部成员变量和对象以及函数实体,删掉函数前面public修饰,以及函数结尾(End Sub/Function),调试检查直到没有错误为止。
类似下面这种结构
Public Interface Imyclass
Function Display() As String
End Interface追问

终于自己找到解决方案了:
Imports System.Runtime.InteropServices

Pubic Class YCImageDo
。。。。。。
End Class

以上是关于[VB]是不是可以在函数中调用自己?的主要内容,如果未能解决你的问题,请参考以下文章

vb 回调函数 详解

AJAX:当函数调用失败/错误时,是不是可以从服务器端返回自定义错误消息? [复制]

vb的函数调用

VB 中的Function过程和Sub过程的 区别在哪?

vb.net如何动态调用WebService接口啊

C语言中,函数是不是可以直接或间接调用自己!!求大神!!求解析!!!