




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5-5 VB与Fortran的混合编程汪润生 (07级硕士研究生)一、 实验简介不同的计算机语言各有其应用目的,在某个相关领域,一种语言可能比较有优势,然而在其他领域,则会显出劣势来。在允许的条件下,将不同的语言结合起来,各取其长处,以弥补单一预言的缺陷,这是计算机语言混合编程的原因。众所周知,Fortran语言在计算方面见长,很多人用他做科学计算的工具;然而其面向对象性和人机交互性很差。VB是一种有名的面向对象编程语言,被人们广泛用来设计操做界面、窗体应用程序、网络应用程序等。而它却不擅长做计算。一些应用中需要结合这两种语言的长处:既要人机交互性好,又要运算速度快,就需要将这两种语言结合起来,通过混合编程的方法实现:用Fortran设计计算部分的核心模块,而用VB设计人机交互界面。我们通过本次实验来体验和实现这两种语言的混合编程。二、 实验目的1掌握VB和Fortran混合编程的方法。2掌握Fortran中动态链接库的创建方法。3掌握VB中对动态链接库的调用方法。三、试验条件在这个实验中,我们需要在PC机上安装VB设计软件和Fortran编译软件。建议安装Microsoft Visual Basic 2005和Compaq Visual Fortran 6.5。四、 实验原理一般人们熟知的实现VB 与Fortran混合编程的方法主要有两种, 即VB中直接调用可执行文件(利用Shell函数直接调用Fortran编译出来的可执行文件) 和利用动态链接库DLL (Dynamic Link Library) 与Fortran 混合编程。第一种方法比较简单,将Fortran源程序编译为可执行文件(扩展名为.exe)之后在VB环境下用shell()函数调用即可。VB中shell()函数的语法如下:Public Function Shell( _ ByVal PathName As String, _ Optional ByVal Style As AppWinStyle = AppWinStyle.MinimizedFocus, _ Optional ByVal Wait As Boolean = False, _ Optional ByVal Timeout As Integer = -1 _) As Integershell()函数的参数中第一项为可执行文件名,如可执行文件不在当前路径下,文件名应包含完整的驱动器和路径名。比如在C盘根目录下由一个名为test.exe的可执行文件,则其pathname=”C:/test.exe”。后面三个参数为可选参数,可根据实际需要选取和设置。因此,对这个可执行文件的调用可以通过下面一条简单的代码来实现:shell(”C:/test.exe”)在整个运行程序过程中, Fortran应用程序始终在后台运行,VB 和Fortran 之间的所有数据交换都是通过磁盘文件进行。这种方法适合于计算量较大而交互操作不多的时候。但是, Shell 函数是以异步方式执行的, 这种执行方式使VB 程序不能等待Fortran 程序计算结束, 而是继续执行后续的程序, 从而容易使最终结果出错。另一种方法是将Fortran源程序编译为动态链接库(扩展名为.dll),然后在VB环境下调用动态链接库里的函数和过程来完成各项计算任务。虽然没有第一种方法操作简单,但是调用动态链接库的方法更为灵活和实用。下面会尽量详细的介绍这种方法。五、 Fortran中动态链接库(.dll文件)的创建出于简单、实用的目的,我们先比较简略的介绍在Visual Fortran 6.5环境下动态链接库的创建步骤和注意事项,当然这些步骤和方法具有一定的通用性。我们在这里列出一些必要的注意事项,但不做详细的说明,因为我们会在后面做出尽量详细的解释和补充,如果有需要可以查阅这些内容。当然这不是必须的,这里所列出的内容已经足够用于创建大部分在VB环境中调用的动态链接库了。下面就做这些介绍。在Compaq Visual Fortran 6.5中创建“.Dll”文件的步骤如下: 1) 创建dll项目(Project)跟一般的Fortran项目相似,首先要创建一个dll项目,具体步骤如下:点击File New,在弹出的new对话框中选择Projects项下的Dynamic Link Library,在右侧Project Name下面的文本框中输入项目名称,在Location下的文本框中选好路径之后点击Ok,这样我们就创建了一个空的dll项目文件。 2)在dll项目中添加文件在刚才创建的dll项目中添加一个空文件,这跟普通的Fortran项目中添加文件的方法一样。点击filenew,在弹出的new对话框中选择Files项,在列表框中选择文件类型(单击选中即可),一般选择Fortran Fixed format Source Files(固定格式源文件)或Fortran Free format Source Files(自由格式源文件),在右边File标签下的文本框中输入源文件名,点击OK,一个空的源文件就建好了,接下来可以在里面编写Fortran源程序了。3)创建子程序(过程)和函数Dll文件是一种特殊的可执行文件,在其源程序中没有主程序,而是一个或多个子程序或函数,我们通过调用这些子程序和函数来完成一些特定的任务。在Dll项目中创建子程序和函数的方法跟一般Fortran项目文件中的没有太大的差别,只需在子程序或函数开始时加入如下一些微软扩展属性编译伪指令即可:!MS$ attributes dllexport !MS$ attributes alias !MS$ attributes value!MS$ attributes reference微软扩展属性编译伪指令是一些特定的指令,有三种写法: 以符号为起始的写法; 以!MS开头的写法;以!DEC$ 开头的写法。中的必须位于首列, 中的!MS中间不能有空格,三种写法后的空格都被忽略。微软扩展属性(Attributes) 编译伪指令是用来指定标识符的微软扩展属性的,它仅有声明作用,不具有定义作用。第一条指令用以说明一个动态链接库接口,说明这一子程序是从动态链接库中输出的;第二条指令用以说明子程序或公共区的外部名称,该外部名称用字符串指定,区分大小写,其它程序(如VB) 要访问这一变量或调用这一函数时,所用名称要用指定外部名称;第三条指令用以说明子程序的某个形参是以传值的形式与实参结合的,这时所传递的是参数的值;第四条指令用以说明子程序的某个形参是以引用的形式与实参结合的,在这种引用方式下,所传递的都是参数的地址,如果子过程中对参数进行了修改,这一修改将带回到调用过程。需要说明的是Fortran程序默认情况下是以传递地址方式传递参数的,即若不指定参数传值方式,则默认为是reference方式。大部分的编译伪指令可写在程序的任意位置。在一条编译伪指令中可赋予多种不冲突的属性,在一条!MSAttributes 指令中不同属性或不同标识符间也用逗号隔开,属性和标识符之间用隔开。举一个简单的例子,如果要编写一个计算双精度实数加法的子程序,子程序名为subplus,输入参数为a和b,输出参数为c,则完整的源程序可以这样写: subroutine subplus(a,b,c)!MS$ attributes dllexport : subplus!MS$ attributes alias :subplus:subplus!MS$ attributes value:a,b!MS$ attributes reference:c real(8):a,b,cc=a+breturnend subroutine subplus其中伪指令!MS$ attributes reference:c 可以省略不写,但为增加源程序的可读性,建议将所有参数的传值方式显式的写出来。一般情况下我们将输入参数定义为传递数值方式,而将输出变量定义为传递地址方式。但这也不是必须的,可根据实际情况而灵活变化。虽然编译伪指令可写在程序的任意位置,但还是建议写在子程序开始之后、其它代码之前,这样也可增强源程序可读性。像这样添加一些子程序函数,然后可以将他们编译和生成dll文件(快捷键是F7)。之后在该项目文件目录下的debug文件夹中可以找到这个以项目名称命名的dll文件,我们可以在VB环境中调用它。下面我们简要介绍一下在VB环境下对Dll文件的调用。六、 VB2005中对动态链接库的调用VB 对动态链接库的调用如同对普通子程序或函数的调用,在调用之前必须先对Dll 中的子程序或函数声明。声明格式如下:Public|Private Declare Sub|Function Name Lib“Libname”Alias“aliasname” (arglist )声明中各项的意义如下:Public , Private 可选的。Public 用于声明对所有模块中的所有其它过程都可以使用的过程(默认) ;Private用于声明只能在包含该声明的模块中使用的过程。Declare是用以声明的关键字。Sub , Function 可选的(但Sub 或Function 二者需选其一) 。Sub 表示该过程没有返回值;Function 表示该过程会返回一个可用于表达式的值。Name 任何合法的过程或函数名,调用动态链接库的入口,注意区分大小写。Lib 必需的,指明包含所声明过程的动态链接库或代码资源,所有声明都需要Lib 子句。Libname 必需的,包含所声明的过程动态链接库名或代码资源名。Alias aliasname 可选的,表示将调用的过程在动态链接库中还有另外的名称。当外部过程名与某个关键字重名时,就可以使用这个参数,当动态链接库的过程与同一范围内的公用变量、常数或任何其它过程的名称相同时,也可以使用Alias ;如果该动态链接库过程中的某个字符不符合动态链接库的命名约定时,也可以使用Alias。aliasname 指动态链接库中该过程的入口处的名称,如果首字符是# ,则随后的字符必须指定该过程入口处的顺序号。arglist 参数的语法为Optional ByVal| ByRef varname () As type 。Optional 可选的,表示参数不是必需的。如果使用该选项,则arglist 中的后续参数都必须是可选的,而且必须都使用Optional 关键字声明。ByVal 可选的,表示该参数按值传递。ByRef 表示该参数按地址传递。ByRef 是Visual Basic 的缺省选项。varname 必需的,代表传给该过程的参数的变量名,遵循标准的变量命名约定。() 对数组变量是必需的,指明varname 是一个数组。type 可选的,传递给该过程的参数的数据类型,可以是Byte 、Boolean、Integer 、Long、Currency、Single 、Double 、Date 、St ring (只支持变长) 、Object 、Variant 、用户自定义的类型或对象类型。例如在C盘根目录下有一个名为mathfunction.dll的动态链接库,我们对这个库中名为subplus的子程序的声明如下:Public Declare Sub subplus Lib C:mathfunction.dll (ByVal a As Double, ByVal b As Double, ByRef c As Double)在声明之后这些函数或过程就可以向普通的函数或过程一样在VB环境下调用了。七、 一些重要的说明和补充这部分是对五、六两部分相关内容的补充和解释,在本次实验中不是必需的,但这些内容很重要,可根据需要查阅。1 动态链接库动态链接库(DLL)是一种在运行时连接的可执行代码和数据模块,是Microsoft Windows 系列操作系统的重要组成部分,是一种特殊的且现在广为应用的函数库。使用普通的函数库时,可以在程序链接时将库中的代码拷贝到可执行文件中,这是一种静态链接。在多个同样的程序执行时,系统保留了许多重复的代码副本,造成了内存资源的浪费。在使用DLL 的情况下,当建立应用程序的可执行文件时,不必将DLL 链接到程序中,而是在应用程序运行时动态地装载DLL 。装载时, DLL 将被映射到进程的地址空间中。同时,使用DLL 的动态链接并不是将库代码拷贝,只是在程序中记录了函数的入口点和接口。不管多少程序使用了DLL ,内存中都只有该DLL 的一个副本。当没有程序使用它时,系统就将它移出内存,减少了对内存和磁盘的要求。所以,使用DLL 的一个明显的好处就是可以节省系统资源。此外,DLL 被广泛地使用,还基于下面的一些原因:(1) DLL 作为一种基于Windows 的程序模块,不仅可以包含可执行代码,还可以包括数据和各种资源等,扩大了库文件的使用范围。有些设备驱动程序也是由动态链接库实现的(扩展名一般是DRV) 。(2) DLL 技术对于开发大型软件系统也有可用之处。一个大型系统,如果用一个执行文件完成,程序将很庞大,而且可能有许多重复的功能。如果将程序分成主程序和DLL ,可以减少开发的工作量。而且由于每个模块减小了,访问的速度也提高了。(3) DLL 另一个用途是支持世界各国的语言。开发者可以将依赖于语言的函数和资源分离出来,专门放进DLL 中,例如中文、英文、法文等。各地使用软件的用户可以安装或运行适当的DLL ,以获取正确的本地信息。这是实现软件商品国际化的一项技术。(4) 将一些功能模块做成DLL 后,如果需要对系统进行升级,只要将个别DLL 进行升级,然后用新的DLL 文件覆盖掉旧的DLL 文件就可以了,而不需要将整个系统进行重新编译和链接。(5) DLL 还独立于编程语言。例如,在Fortran 环境中开发的DLL 程序可以在Delphi 、Visual Basic 和Visual C + + 环境中方便地使用。正是由于以上诸多优点,DLL 有着非常广泛的用途,是Windows 程序设计中的一个非常重要的组成部分。2 Fortran 与VB之间调用约定的协调VB 应用程序调用Fort ran 创建的DLL 时,必须保证VB 应用程序中所声明的例程(子程序和函数) 类型及例程名和DLL 中输出的一致,实参和形参在堆栈中的排列顺序一致,实参和形参的数据类型一致以及实参和形参的传递方式一致。(1) 例程实现机制的对应例程是子程序和函数的统称,二者的区别是子程序没有返回值,而函数有返回值,它们在Fortran 和VB中的声明关键字也不是完全一致的。Fortran 中的子程序用Subroutine 声明,在VB 中声明该例程时应该用Sub 对应;Fortran 中的函数用Function 声明,在VB 中亦是用Function。(2) 参数在堆栈中排列顺序的一致性Fort ran 的调用约定有C、Stdcall 和缺省约定,它们都使用堆栈传递例程参数,且传递方向是从左到右。也就是说,在执行例程调用时,调用程序将参数从右到左依次压入堆栈,被调用例程在接收参数时,将参数从左到右依次从堆栈弹出。VB 应用程序调用DLL 中的例程时遵循从左到右的传递方向,且由被调方负责清除堆栈,因此Fortran 的调用约定应声明为Stdcall 或缺省,不能声明为由调用程序清除堆栈的C。(3) 例程名的一致性Fortran 本身不区分大小写,但若Fortran 源代码中未使用别名(Alias) 属性,则建造DLL ,生成目标代码时, 目标代码中的例程名随调用约定的不同而呈现出不同的形式,表1为Fortran 目标代码中的例程名的形式。而VB 区分大小写,因此,若Fort ran 采用缺省的调用约定,则在VB 中须声明为: Private | Public Declare Sub name LiblibnameAlias_NAME n ( ByVal variable As type , ByVal variable Astype ) 。表1 不同调用约定对应的目标例程名Fortran 调用约定源代码中的例程名目标代码中的例程名缺省Name_NAMEn (全部大写)CNamename (全部小写)StdcallName_name n (全部小写)注:表中n 是例程参数列表所占堆栈字节数显然,这样做是很麻烦的,也容易出错。我们可以利用Alias 属性来消除调用约定给目标代码中的例程名带来的影响。最简单也最不容易出错的办法便是在Fortran 源代码(假如其中含有一个名为DllApp 的子程序) 中添加声明: !MS$ ATTRIBUTES Alias :DllApp : :DllApp,则生成的目标例程名就固定为DllApp了,与源代码中的例程名完全相同。此时在VB 中可简单地声明为: Private| Public Declare Sub DllApp Lib libname ( ByVal variableAs type ,ByVal variable As type ) ,不必写出Alias 属性,VB 默认为所有源例程名和目标例程名相同。(4) 参数数据类型的一致性VB 调用Fortran 创建的DLL 中的例程时,形参和实参的数据类型必须匹配,否则会发生错误。在Fortran90 中,它的数据类型和VB 的并不是全部一一对应的,但我们用于计算的常用数据类型有着精确的匹配,如表2 所示。表2 VB与Fortran 数据类型对照表FortranVisual basic 6.0Visual basic 2005字节数Integer(2)Integershort2Integer(4),integerLonginteger4Real(4),realSingleSingle4Real(8)doubleDouble8(5) 参数传递方式的一致性参数的传递方式分为值传递和引用传递两种。在VB 中声明DLL 中的例程时,若按值传递,则在参数前面加上“ByVal”关键字, 若按引用传递,则在参数前面加上”ByRef”关键字;在Fort ran 的例程中,按值传递和按引用传递可分别用VALUE 和REFERENCE 属性来说明。当通过值来传递变量时,实际上是将变量的一个副本传给调用的例程,该例程可以修改变量值,但这个值的改变只影响到副本,不能影响变量本身。若采用引用传递来传递变量时,传递的是变量实际内存地址,所以在例程内修改变量的值会改变变量本身的值。在缺省情况下,Fort ran 和VB 的参数按引用方式传递。例如,在Fortran 中有一例程如下:subroutine DllApp (a ,b ,c)!DECATTRIBUTES DLLEXPORT : :DllApp!DECATTRIBUTES Alias :DllApp: :DllApp ! 指定目标例程名为DllApp!DECATTRIBUTES Value : : a ,b !规定参数a ,b 按值传递,参数c 默认按引用传递integer (4) a ,b ,cc = a + bend subroutine DllApp则在VB 中应声明为:Private Declare Sub DllApp Lib “ForVB. Dll”(ByVal a As Long , ByVal b As Long , ByRef c As Long)在参数传递过程中,应注意数组的传递。数组只能按引用传递,传递数组的第一个元素就是把数组的首地址传递给了Fortran ,完成VB 向Fortran的数组传递。另外,在缺省情况下,VB 数组的第一元素的下标为0 ,而Fort ran 数组的第一元素下标为1 ,因此,要在VB 应用程序数组定义部分写出下列类似语句:Dim Arr (1 to 100 ,1 to 50) As Long ,以使两者的下标值一致。例如,Fort ran 中有一例程:subroutine DllApp (a ,c)! DEC ATTRIBUTES DLL EXPORT : :DllApp! DEC ATTRIBUTES Alias :DllApp: :DllAppinteger(4) a (2) ,cc = a (1) + a (2) ! 求和运算,由c 返回运算值。形参a 和c 默认按引用传递end subroutine DllApp则在VB 中的调用形式如下:Call DllApp (a (1) , c)在VB 中数组a 须定义为Dim a (1 To 2) As Long3Dll的导出声明要使Fortran 创建的DLL 能被外部模块调用,在Fortran 例程中须通过DLL EXPORT 属性进行导出声明,例如:!MS$ ATTRIBUTES DLLEXPORT : :DllApp ! 声明导出例程DllApp4 Dll 的导入声明在VB 应用程序中调用DLL 中的例程时,应先通过以下两种方法之一导入例程:静态装载和动态装载。(1) 静态装载这种方法十分简单,只需在VB 的通用部分声明一个外部例程,之后,应用程序便可对它进行调用。声明的形式前面已经介绍过了,这里不再赘述。静态装载在应用程序运行时便装入库模块,程序运行结束时卸载库模块。(2) 动态装载它是指在应用程序运行时让程序和库模块进行动态连接,而不必在程序首次装入内存时便进行连接。当程序调用DLL 中的例程时,应用程序首先装入要使用的DLL 库,并直接检索所需例程的地址,以上操作成功后应用程序就可调用这个例程了。这可以通过三个Windows API 函数来实现:LoadLibrary、Get ProcAddress 和FreeLibrary。例如:hHandle = LoadLibrary (ForVB. dll) 函数LoadLibrary 将DLL 动态地装入内存if hHandle 0 then 判断装载是否成功lpSub = Get ProcAddress(hHandle , DllApp)函数Get ProcAddress 获取DLL 中指定模块的地址if lpSub null then执行体end ifFreeLibrary (hHandle) 函数FreeLibrary 动态地卸载DLL ,并释放资源end if5 Dll文件搜索路径在前面的讲述中,VB 应用程序声明一个例程时的Lib 中只写了库名:Lib ForVB. dll,并未指明具体的路径,此时Windows 会按下述步骤进行查找:当前目录、Windows 目录、Windows 系统目录、包含当前任务可执行文件的目录、列在PATH 环境变量中的目录、网络的映像目录列表。当然我们也可以指明DLL 所在的具体路径来装载。例程导入后,我们就可以像调用普通例程一样调用它们了。6 Microsoft 扩展属性及其含义下面将一些可能会用到的Microsoft 扩展属性及其含义列在下表中,以备查阅。属性名称含义备注ALIAS为函数或子程序指定在调用方的名字,也可为数据对象指明其他名称一般应为输出函数或子程序指明该属性C指明C方式属性的调用约定若二者均未指定,则使用不同于二者的缺省方式STDCALL指明STDCALL方式属性的调用约定DLLEXPORT调用方仅可调用指明该属性的函数或子程序DLLIMPORT在调用其它DLL文件的出口文件时使用EXTERN指明其它源文件的全局变量REFERENCE按引用方式传递参数或调用函数VALUE指定参数传递为传值方式VARYING参数类型强制匹配八、 一个简单的应用实例这里通过一个简单的实例,来说明混合编程的完整的过程,同时将代码给出来,可以做一个简单的练习。这个混合编程例子要完成如下的任务:用Fortran编写一个Dll文件,其中包含计算两个双精度实数加、减、乘、除的过程和函数,而后在VB环境下设置简单的界面,通过调用这些过程和函数来完成两个输入双精度实数的加、减、乘、除运算,并将计算结果显示出来。步骤和源代码如下。1 Fortran中创建一个名为mathfunction的Dll项目,在项目中添加一个名为mathfunction的固定格式源文件,添加如下代码:*subroutine* subroutine subplus(a,b,c)!MS$ attributes dllexport : subplus!MS$ attributes alias :subplus:subplus!MS$ attributes value:a,b!MS$ attributes reference:c real(8):a,b,cc=a+breturnend subroutine subplus subroutine subsubtract(a,b,c)!MS$ attributes dllexport : subsubtract!MS$ attributes alias :subsubtract:subsubtract!MS$ attributes value:a,b!MS$ attributes reference:c real(8):a,b,cc=a-breturnend subroutine subsubtractsubroutine submultiply(a,b,c)!MS$ attributes dllexport : submultiply!MS$ attributes alias :submultiply:submultiply!MS$ attributes value:a,b!MS$ attributes reference:c real(8):a,b,cc=a*breturnend subroutine submultiplysubroutine subdivide(a,b,c)!MS$ attributes dllexport : subdivide!MS$ attributes alias :subdivide:subdivide!MS$ attributes value:a,b!MS$ attributes reference:c real(8):a,b,cc=a/breturnend subroutine subdivide*subroutine*而后在项目中另添加一个名为mathfunction2的固定格式源文件,添加如下代码:*function* function funplus(a,b)!MS$ attributes dllexport : funplus!MS$ attributes alias :funplus:funplus!MS$ attributes value:a,b real(8):a,b,funplusfunplus=a+breturnend function funplus function funsubtract(a,b)!MS$ attributes dllexport : funsubtract!MS$ attributes alias :funsubtract:funsubtract!MS$ attributes value:a,b real(8):a,b,funsubtractfunsubtract=a-breturnend function funsubtractfunction funmultiply(a,b)!MS$ attributes dllexport : funmultiply!MS$ attributes alias :funmultiply:funmultiply!MS$ attributes value:a,b real(8):a,b,funmultiplyfunmultiply=a*breturnend function funmultiply function fundivide(a,b)!MS$ attributes dllexport : fundivide!MS$ attributes alias :fundivide:fundivide!MS$ attributes value:a,b real(8):a,b,fundividefundivide=a/breturnend function fundivide*function*这些函数和过程都很简单,主要的运算代码都只有一条。函数和对应的过程可以完成同样的功能,这样重复写只是为了说明在VB中对过程和函数在声明格式和调用方法上的细微差异。这两个文件也可以写在一个文件里,或者每个函数或过程独立写一个文件,这只是为了编写程序的方便,对其在VB的调用没有任何影响。编写好源代码后编译生成Dll文件。随后我们会在该项目所在目录下的debug文件夹中找到这个名为mathfunction.dll的文件。将这个Dll文件拷贝到C:WINDOWSsystem。2 在VB2005中新建一个名为vb_fortran的Windows Application项目,设计界面,添加三个Label,三个Textbox和四个Button,将其 text属性分别设置如下图所示:图中的文本框从上到下依次为textbox1,textbox2,textbox3,按钮从上到下依次为button1,button2,button3,button4,在代码编辑器中输入以下代码:Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim a As Double Dim b As Double Dim c As Double a = CDbl(TextBox1.Text) b = CDbl(TextBox2.Text) Call subplus(a, b, c) c = funplus(a, b) TextBox3.Text = c End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim a As Double Dim b As Double Dim c As Double a = CDbl(TextBox1.Text) b = CDbl(TextBox2.Text) Call subsubtract(a, b, c) c = funsubtract(a, b) TextBox3.Text = c End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim a As Double Dim b As Double Dim c As Double a = CDbl(TextBox1.Text) b = CDbl(TextBox2.Text) Call submultiply(a, b, c) c = funmultiply(a, b) TextBox3.Text = c End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Dim a As Double Dim b As Double Dim c As Double a = CDbl(TextBox1.Text) b = CDbl(TextBox2.Text) Call subdivide(a, b, c) c = fundivide(a, b) TextBox3.Text = c End Sub End Class上面的代码也很简单。代码中将对过程的调用注释掉了,因为这里对过程和对函数的调用结果是一样的,任选其一都可以,注意调用的格式就可以了。在项目文件中添加一个模块文件,输入以下代码:Module Module1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工业互联网平台入侵检测系统智能化检测与响应优化
- 2025年文化娱乐产业消费者行为分析:市场细分与竞争策略001
- 2026届内蒙古喀喇沁旗锦山蒙古族中学化学高二上期中学业水平测试模拟试题含解析
- 现代诗歌批评性鉴赏课件
- 2025年高中地理教师资格证考试教育评价方法押题真题试卷
- 2026届河北省唐山市重点初中高二化学第一学期期末质量跟踪监视模拟试题含答案
- 2026届四川省广安遂宁资阳等六市化学高二上期末教学质量检测试题含答案
- 2026届陕西省延安市吴起县高级中学化学高三上期末综合测试试题含解析
- 眼睛科普问答题目及答案
- 2026届嘉峪关市重点中学化学高一第一学期期中学业水平测试模拟试题含解析
- 急性st段抬高型心肌梗死
- 幼儿文学课件完整版
- DB6101T3128-2022养老服务规范 助餐服务
- GB/T 21709.8-2008针灸技术操作规范第8部分:皮内针
- 资本论第三卷讲义课件
- 离心式压缩机试车记录
- 穴位敷贴中医护理技术操作规范
- 冷却塔投标文件
- 地下室开槽引流方案
- 青年教师专业成长课题结题报告
- 农村公路安全生命防护工程施工方案
评论
0/150
提交评论