调用程序

2024-08-08

调用程序(共7篇)

调用程序 篇1

摘要:工程中往往需要VC++编写的程序进行大量的数学计算,如能在程序中使用Matlab的例程这些问题则能迅速解决。在Win-dows平台上Matlab提供了两个实现这一目标的接口——Matlab Engine和Automation Server,两者在本质上都基于COM技术。引擎库通过其输出函数对用户屏蔽了底层的COM细节,这大大方便了使用。而使用自动化服务器就要使用COM的自动化接口IDispatch,不过MFC库的COleDispatchDriver类已使这一过程大大简化了。两种方式的差别主要体现在参数传递和返回值处理上,如文中代码所示。无论哪种方法,都可以将具有强大工程计算能力的Matlab接入VC++程序,从而快捷方面地解决许多数值计算和图形输出问题。

关键词:Matlab外部接口,混合编程,VC++,COM,自动化

1 引言

Matlab提供的编程语言———M语言———是以方便数值计算编程为目的设计的,所以其基本数据结构就是矩阵,且其变量的具体类型和大小可在执行时动态确定,这对编写数值计算程序提供了很大的便利。另外,由于M语言可直接调用Matlab提供的各种数学和面向工程应用的工具箱函数,所以使用M语言还可以迅速地解决许多计算量很大的工程问题。但另一方面,由于M语言是一种解释型编程语言,所以它的执行效率较低,另外其在开发应用程序界面和对外围设备的控制能力上也较差。另一方面,其他的编程环境,如VC++,则在这些方面提供了很好的支持,但如用其进行数值计算或解决工程问题又会非常不便。故如果对软件界面、外围设备控制、数值计算三方面都有较高的要求,一个理想的方案是在像VC++这样的编程环境中实现界面及外设控制功能,并在其中调用Matlab环境中的模块,如其工具箱函数,作为计算工具。

在VC++程序中调用Matlab有两种方法:一是通过Matlab提供的引擎库(Engine Library),它的本质是一个拥有定制接口IEngine的COM服务器;二是通过Matlab提供的COM Automation Server。本文将首先介绍COM和Automation技术的原理和应用方法,之后介绍这两个接口,并随后给出在C++中使用两者的具体方法。

2 COM与Automation

2.1 COM概述

组件对象模型(Component Object Model,COM)由Microsoft于1993年创建,它规定了dll、exe等应用模块之间进行交互的步骤和方法。在COM之前,一个应用程序(Client)如果要使用dll文件(Server)输出的功能就要使用Win32 API函数LoadLibrary,GetP-rocAddress,要使用exe文件(Server)输出的功能除了需使用相关的Win32 API函数外,还要使用基于Windows消息机制的DDE协议。COM则是Microsoft新推出的这些方法的换代品,它解决了不少在使用老方法时产生的问题,如他们本质上是面向过程的技术,使用起来比较零散复杂,且对系统来说,他们是无法管理的。COM则提供了一个面向对象的Server功能管理及Client/Server的通讯方法。但这需要应用编程者的配合,即COM不仅是Windows操作系统新增的一系列数据结构和函数,而且是一系列应用与系统交互方式的定义。

在COM中,Server模块(dll或exe)要向系统注册其输出的COM类,即在注册表中保存COM类的GUID(Global Unique Identifier),Server模块完整的路径及文件名等相关信息。一个Server模块可拥有多个COM类。于是,Client只要向系统提供其所需COM类的GUID系统就能找到包含这个类的模块并加载它。在注册COM类的同时,Server还要注册每个COM类所包含接口(interface)的GUID。从功能上说,一个接口就是Server输出的一个功能单元,它由一组功能上密切相关的函数指针构成;而用C++语言表达,COM接口就是一个仅包含虚函数的结构体,它本质上是一个包含一个函数指针数组的内存结构,这一内存结构是由Microsoft定义的标准。Client则是通过GUID向系统提交自己的请求,通过获得由Server提供的接口指针来调用Server的输出函数[1]。

事实上,接口是COM技术的核心要素,其最基础的接口是Microsoft定义的标准接口IUnknown,它包含QueryInterface、AddRe和Release三个函数,这些函数是Client与Server通信的基础。而所有其他的接口均需继承自IUnknown。这也是C++多态技术的一个应用。除了IUnknown,Microsoft还定义了许多其它接口,这些接口事实上是许多编程技术的底层基础,如IDispatch接口就是Automation技术的根本核心。同时需要说明的是,对其制定的大部分接口而言,Microsoft只是定义了接口的数据结构,接口函数功能的实现要由Server开发者完成。

可见,COM是一个Client、Server和操作系统协力合作。从操作系统的角度看COM是一个记录COM类的方式和一组用于Clien和Server通信的API函数。对Client来说COM是利用API向系统发出请求并利用接口指针使用COM类的功能。对Server来说则是利用API注册自己,实现所有接口函数,这包括由Microsoft定义的接口函数,如Server必须实现IUnknown接口的QueryInterface函数,其作用是为Client提供其所要求的所有接口指针。

2.2 Automation概述

由于接口本质上是一个包含一个函数指针数组的内存结构,这一内存结构是由Microsoft定义的标准,而所有支持COM的编译系统和语言对接口的处理都符合这一标准,所以通过COM,就可实现不同编译器、不同语言编写的应用顺利通信。但是仍有一个问题,就是想Visual Basic这样的解释性语言无法学习C++定义的接口。举例来说,如果一个C或C++程序要使用一个组件定义的接口IMath,它就需要声明接口的结构,如:

这样,在获得了接口指针,不妨叫pIMath,之后,就可以用“pIMath->Add(a,b);”这样的语句来使用Server的功能。但Visual Basic却不支持这样的语法,即它的解释程序无法以函数指针的形式学习新的接口定义。考虑到接口将会不断增长的事实,让Visual Basic把对所有接口的支持固化在解释程序中又是不可能的。所以,为了解决这类问题,Microsoft定义了IDispatch接口,其思想是,像VB这类语言的解释程序只需要支持IDispatch接口,就可以在执行时通过Server获得其需要函数的相关信息,从而完成调用。

整个接口的机制是Server要为输出的函数分配一个数字ID和一个相对应的标识字符串。Client只知道标识字符串,为了调用相应的函数,Client在获取IDispatch接口指针后,先调用其函数GetIDsOfNames()得到和标识字符串相对应的数字ID,再调用IDispatch的函数Invoke(),该函数专门负责根据输入的数字ID找到Client要求的函数,并调用它。Invoke()在调用函数时需要传递参数,而参数格式是无法由解释程序预知的,所以Invoke()使用了一种特殊的数据类型VARIANT来解决这一问题。VARIANT是一个结构体,它可以表示任何类型的数据。VARIANT主要由两部分组成,一是标识数据类型的vt,二是存储实际数据的union结构。函数的输入参数就被存储在一个VARIANT数组里被传递给Invoke。当然,之后解析各个变量并传递给输出函数的任务就交由Invoke()完成了。函数的返回值同样是以VARIANT形式回传的。这样,就解决了高级语言使用COM组件的问题。

所以,自动化(Automation)是建立在COM基础上的。一个自动化服务器实际上就是一个实现了IDisPatch接口的COM组件。而一个自动化控制器则是一个通过IDisPatch接口同自动化服务器进行通信的COM客户。

3 Matlab提供的COM Server接口

由于出现了Automation技术,访问COM组件就有了两种方式:(1)通过普通的自定义的COM接口访问组件;(2)通过调度接口IDisPatch访问组件;如果一个组件同时实现了这两种接口,则称为双重接口,那么客户就可自由的选择其中的一种方式访问组件的功能。Matlab就提供了这两种接口。

3.1 IEngine接口

IEngine是Matlab提供的定制接口,但通常在程序中不会直接使用它,而是使用Matlab提供的引擎库(Engine Library)函数。事实上,COM Server及其接口IEngine可看作是引擎库在Windows平台上的实现手段。当然,也可以把引擎库看作Matlab为方便IEngine的使用而提供的函数库。在使用引擎库时,完全不需要COM的知识,只需要把它看成一个非标准的C语言静态函数库即可。

引擎库共输出了9个函数,通过它们可以方便的开始和结束与Matlab Server的对话,设置命令窗口(缺省状态是显示命令窗口),与Matlab的工作空间交换变量,执行任何可在Matlab命令行执行的命令。使用引擎库和直接在Matlab命令行输入的方法是极为类似的。

3.2 IDispatch接口

IDispatch是Matlab为Visual Basic,C#等语言提供的接口,但在C++程序中也可以使用,只不过,这需要进行较多和COM相关的编程。如果使用VC++提供的MFC类COleDispatchDriver来使用Matlab自动化服务器,则可以大大简化这一过程。这些内容后面会详细讨论。

通过IDispatch接口获得的函数功能和引擎库类似,但功能更丰富更灵活些。例如,如果要调用统计工具箱的方差计算函数求某一双精度数组的方差,使用引擎库函数的流程必须是先通过engPutVariable()将数组存入Matlab,比如起名叫“a”;再用engEvalString()命令执行一条语句“b=std(a)”,这在执行命令的同时又在Matlab里建立了变量“b”;最后通过engGetVariable()将变量"b"取回。Matlab的自动化服务器则除了拥有支持上面流程的函数外,还提供了另一种可能性,即只需调用函数Feval()就可以了,因为Feval(可同时接受函数名,参数作为输入,并将Matlab的计算结果输出。

4 Matlab COM接口的VC++调用

在VC++中使用Server的关键问题有两类,一类是如何启动和释放Server,另一类是如何与Matlab进行数据交互。下面将分别针对这两方面,以一个具体的问题———方差的计算,待计算的数据保存在变量double Array[20]中———为例,说明调用Matlab两种COM接口的具体操作。下面的代码均经过实际测试使用,其环境为WindowXP,Visual C++6.0和Matlab 7.4.0。

4.1 Server的启动和释放

4.1.1 引擎库

使用引擎库在创建工程时不需要特别设置,但之后第一要在源文件中包含engine.h,它其中声明了引擎库函数的原型。engine.h中还包含头文件matrix.h,其最主要的内容是定义了数据类型mxArray及对它进行操作的函数原型。mxArray类型是许多引擎库函数的参数类型,它是C++程序和Matlab进行数据交互的工具。而matrix.h中又包含tmwtypes.h,这一头文件中也定义了一些数据类型。三个头文件的路径均为Matlab安装目录下的externinclude。将engine.h包含入源文件有三种方法,其一是在源文件中包含完整的路径和文件名,如“#include"D:matlabexternincludeengine.h”;其二是仅包含文件名,但把上述三个头文件全部拷贝到工程目录中;其三也是只包含文件名,但要在VC++6.0的Tool菜单的Option命令对话框的Directory选项卡中,把头文件所在路径添加到include搜索路径中。这之后,还要为工程加入两个库文件———libeng.lib和libmx.lib,其中libeng.lib实现了引擎库函数,而libmx.lib则实现了操作mxArray需要的各个函数。它们路径均为Matlab安装目录下的externlibwin32microsoft。具体操作为右键单击VC++6.0左侧Workspace里FileView的工程文件,在弹出菜单中选择“Add File to Project”,之后在弹出的对话框中转到上述目录后将文件过滤设为“Library Files”就可以选择所要的库文件了。为方便代码的移植,则可以先将上述文件复制到工程所在目录再进行添加。

在做好这些准备工作后,就可以正式使用引擎库了。引擎库启动可使用如下代码:

4.1.2 自动化服务器

在C++程序中直接用Win32 API操作自动化服务器是比较繁琐的,所以笔者对自动化服务器的操作是通过MFC的COleDispatchDriver类完成的。这就要求在创建工程时要加入对MFC类的支持。之后,启动Class Wizard,单击其新建类按钮中的“从类库(type library)”命令从而打开“从类库导入”为标题的对话框。在对话框中转入Matlab安装目录下的binwin32文件夹,选择其中的mlapp.tlb文件就可以生成继承自COleDispatchDriver类的DIMApp类。

完成上述工作,就可用下面代码启动Matlab自动化服务器:

4.2 数据交换

无论是采用哪种调用方式,Client都需要一种中间数据类型来与Matlab交互数据。当要把参数传递给Matlab时,Client需要先把自己的数据转换成中间类型;当从Matlab获取结果时,Client要从中间类型中提取原始数据。对引擎库来说,这种中间类型是mxArray;对自动化服务器来说,这种中间类型是VARIANT。下面通过代码来说明这两种方式。

4.2.1 引擎库

使用引擎库的代码如下:

4.2.2 自动化服务器

使用自动化服务器的代码如下:

5 总结

COM是Microsoft公司提供的提高应用互操作性能的接口,利用Matlab提供的两个COM接口———IEngine和IDispatch,在Matlab引擎库或MFC类COleDispatchDriver的帮助下,VC++程序可很轻松的在程序中使用Matlab丰富的函数和图形功能[2],从而加快程序的开发。但这需要Matlab环境的运行。除了Matlab engine library(引擎库)和COM Automation Server,Matlab对COM的支持还有MATLAB Builder for.NET。它可以根据编程人员的要求将一组M文件编译成可供其它支持COM语言调用的COM组件,VC++程序使用这些组件就可以脱离Matlab[3],但不是所有的Matlab函数都可以被编译。

参考文献

[1]Shepherd G,Wingo S.MFC internals:inside the microsoft Foundation Class architecture[M].Reading,Mass:Addison-Ewsley,1996:435-497.

[2]赵启蒙,高美娟.通过面向对象编程调用MATLAB绘图的实现[J].大庆石油学院学报,2004,28(1):80-82.

[3]姚光强,陈立平.基于COM技术的C#与Matlab混合编程[J].计算机工程,2008,34(14):87-89.

调用程序 篇2

用VB轻松调用其他程序

我们编写程序时,有时会遇到在一个程序中调用并控制另一个程序执行的情况,在一些编程语言中实现起来较为繁琐,但如果用VB编写时,则可轻松实现。下面我就以在程序中调用“计算器”为例,总结了以下几种方法:

一、以异步方式来执行其他程序

Shell 函数是以异步方式来调用其他程序的。也就是说,用Shell启动的程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。

语法:Shell(pathname[,windowstyle])

说明:pathname:必要参数。Variant(String),要执行的程序名,以及任何必需的参数或命令行变量,可能还包括目录或文件夹,以及驱动器。

例如:RetVal = Shell(″C:WINDOWSCALC.EXE″, 1) ′ 调用计算器。

二、以同步方式来执行其他程序

有时候,我们需要让VB在执行完外部程序后再执行下一语句,这就需要使用API函数。

我们可通过OpenProcess和CloseHandle函数来检测调用软件的运行情况。这两个函数的声明如下:

Declare Function OpenProcess Lib ″kernel32″ Alias ″OpenProcess″ (ByVal dwDesiredAclearcase/” target=“_blank” >ccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Declare Function CloseHandle Lib ″kernel32″ Alias ″CloseHandle″ (ByVal hObject As Long) As Long

建立下面函数,用以判断程序是否在运行,如果是,则在运行时返回True。

Function IsRunning(ByVal ProgramID) As Boolean ′传入进程标识ID

Dim hProgram As Long ′被检测的程序进程句柄

hProgram=OpenProcess(0,False,ProgramID)

If Not hProgram=0 Then

IsRunning=True

Else

IsRunning=False

End If

CloseHandle hProgram

End Function

例如要调用计算器(CALC.EXE)并等到它运行完成后再执行下一语句,可以使用以下代码:

Dim RetVal

MsgBox ″开始运行″

RetVal = Shell(″C:WINDOWSCALC.EXE″, 1)

While IsRunning(RetVal)

DoEvents

Wend

MsgBox ″结束运行″

三、关闭正在运行中的其他软件

如果要在程序中关闭正在运行中的其他程序,可以先使用FindWindow函数找出相应的程序句柄,然后调用PostMessage函数关闭该程序即可,

这两个函数的声明如下:

Declare Function FindWindow Lib ″user32″ Alias ″FindWindowA″ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function PostMessage Lib ″user32″ Alias ″PostMessageA″ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

例如要检测“计算器”程序是否正在运行,如果是则关闭它,可以使用如下代码来实现:

Dim winHwnd As Long

Dim RetVal As Long

winHwnd=FindWindow(vbNullString,″计算器″)

If winHwnd〈〉0 Then

RetVal=PostMessage(winHwnd,&H10,0&,0&)

If RetVal=0 Then

MsgBox ″关闭计算器出错!″

End If

Else

MsgBox ″计算器程序没有运行。″

End If

表格法辅助阅读递归调用程序 篇3

在递归调用程序中,比较容易阅读的是求解数学上阶梯函数的递归调用程序。首先在程序中找到递推语句、递归结束条件及递归结束时的值,根据递推语句一步一步递推,直到条件成立获得递归结束时的值,使递推结束;然后一步一步回归,即可求得函数的值。递推的轨迹和回归的轨迹都比较清晰。若递推语句之后还有赋值语句或输入输出语句等,则递推的每一步要将许多参数压栈,回归的每一步又要根据先前压栈的相关参数确定若干变量的值,程序阅读起来就比较复杂。使学生能顺利正确地阅读这类程序是教学难点之一。教学实践表明,在阅读递归调用的程序时引入表格法,可以使学生感觉有方法可依,能够按部就班地阅读程序,克服畏难情绪,也能够有效防止出错。越是阅读复杂的递归调用程序,表格法越是能显示其有效作用。本文以一道Visual Basic二级考试题为例,介绍怎样采用表格法辅助阅读递归调用程序。

例题如下:运行下面的程序,单击命令按钮Command1,则在窗体上显示的第一行内容是____,第二行内容是___,最后一行内容是_____。

1. 通读程序找出递推语句和递推结束语句

在本例中,程序由主过程Command1_Click()和函数过程Recursion%(A%,B%)构成。在主过程中从“Lcm=Recursion (N, M)”语句开始调用函数过程Recursion%(A%,B%)。函数过程Recursion%(A%,B%)以A、B为形式参数,采用传址调用。“Recursion=2*Recursion (A+A/k, B)”语句为递推语句。“A Mod B=0”是递推结束的条件,“Recursion=A”语句是递推结束语句。程序执行过程中,只要“A Mod B=0”条件不为True,就使递推语句“Recursion=2*Recursion (A+A/k, B)”执行一次,直到“A Mod B=0”条件为True,执行“Recursion=A”语句,递推才结束。

2. 用表格演绎递推过程

表一是为阅读递归调用程序而设计的表格,其横向从左向右表示递推的步骤,每一列表示递推一步,即调用自身一次;纵向依序是程序执行语句中的表达式。表格的含义就是每递推一步,程序中各表达式依照其顺序应该获得什么值。在阅读程序时,程序的阅读者首先应该按照程序语句执行的顺序将各个表达式填入表格,然后开始逐步递推。在递推过程每一步中,要填写递推步骤序号,填写在本步递推中各个表达式获得的值。对于本例而言,因为“A Mod B=0”是递推结束条件,当在某一步中A与B的值相等时,表明该步骤是递推的最后一步了。从已填的表格可见,在递推结束之前,递推结束条件“A Mod B=0”在每一步均为False,因此执行“Recursion=2*Recursion (A+A/k, B)”语句。而“Recursion=2*Recursion (A+A/k, B)”语句并不能立即获得具体的值,要用“A+A/k, B”作为实际参数调用Recursion%(A%,B%)函数一次。当递推结束条件“A Mod B=0”的值为True, Recursion获得值64,即获得参数A的值,递推结束。在递推结束后,程序要向下执行语句“Print 2*A, k”和“k=k-1”,开始回归。因此,在递推的最后一步,程序阅读者还应该填写表达式“2*A, k”和“k”的值。

3. 用表格演绎回归过程

在表一的下方再增加一行,从右向左表示回归的步骤,如表二所示。在本例中,回归的每一步做三件事:(1)根据得到的Recursion值计算“2*Recursion”的值并赋值给Recursion自身;(2)执行“Print 2*A, k”语句;(3)执行“k=k-1”语句。表格中后三栏分别记录“2*Recursion”、“2*A, k”、“k”三个表达式在回归的每一步中所获得的值。因此,在回归的每一步中,程序阅读者应该做的事情是分别填写表达式“2*Recursion”、“2*A, k”、“k”的值。

4. 根据表格答题

程序阅读者根据所填的表二,就可以进行答题工作,即填写题目所留的空格。依据程序,在窗体上显示信息是由函数过程中的语句“Print 2*A, k”和主过程中的语句“Print“Lcm=”;Lcm”完成。“Print 2*A, k”语句在回归的每一步中执行一次,显示一行信息,即表达式“2*A, k”的值,共显示四行。主过程中的语句“Print“Lcm=”;Lcm”执行一次,在窗体上显示的信息为第五行。

因此,在窗体上显示的第一行内容是,第二行内容是,最后一行内容是。

5. 结语

本文为参加Visual Basic二级考试的学生阅读递归调用程序提供了一种有效的方法,这种方法能够有效地阅读复杂的递归调用程序,防止出错。使用这种方法达到熟练以后,在阅读递归调用程序时不一定要画出表格,可以在程序的旁边根据递推与回归的步骤,按行按列依序写出各个表达式的值,但要做到心中有表。

参考文献

[1]龚沛曾, 杨志强, 陆慰民.Visual Basic程序设计教程[M].北京:高等教育出版社, 2007.

调用程序 篇4

关键词:C语言,Fortran语言,混合语言编程,Windows,Linux

随着微型计算机的高速发展和普及,数值模拟或者数值仿真在科研与工程中的应用范围越来越广。物理问题的数值模拟过程必须通过由高级计算机语言(如C,Fortran,C++等等)所编写的计算机程序来实现。Fortran语言因其在数值计算方面具有其特有的优势以及流程简洁,易懂的特点,从而倍受从事数值计算的科研人员的喜爱。在www.netlib.org网站上可以下载到大量成熟的、开放的、以Fortran语言编写的数值计算的源程序。这些程序是从事数值计算的科研人员和工程师的知识宝库。它们可以很容易地向零件装配一样移植到我们自己的程序之中,从而可以节约大量宝贵的时间,避免了不必要的重复劳动。随着计算机技术的不断发展,C、C++等高级计算机语言越来越受到人们的喜爱。尤其当程序中要处理大量的字符串时,这些语言比Fortran语言具有明显的优势。因此,为了兼顾Fortran语言和C语言等的优势,所以现在混合编程得到了越来越多的应用。

Windows操作系统下的混合编程在Compaq Visual Fortran 6.6的帮助文件[1]中有较为详细的介绍。对于初学者来说,仅靠参考该帮助文件而来很好地实现Fortran与C或C++的混合编程还是比较困难的。为此,国内有些学者已经发表了在这方面的研究和体会。肖晓玲等[2]、周振红等[3]以及简建勇等[4]研究了VC与Fortran的混合语言编程。他们详细地描述了VC与Fortran之间的调用约定,命名约定以及参数传递方式。两文中均没有完整的混合语言编程源程序以供参考。黄芝平等[5]研究了VC++6.0与Fortran PowerStation4.0之间的混合语言编程。文中将Fortran语言源程序制作成动态链接库的例子非常具有参考价值,初学者参考后易于实现。在此期间,张向强,陈志英[6]也研究了VC++6.0与Fortran PowerStation 4.0之间的混合语言编程。2006年,章大勇,郑海[7]研究了VC++可执行程序调用Fortran语言编写的可执行程序的混合语言编程方法。该方法并不涉及这两种语言之间的混合程序编写问题。最近,亓雪冬等[8]研究了Linux操作系统下Fortran与C语言的混合编程方法。文中介绍了若干种Fortran与C混合编程的方法。与前面列举的大部分参考文献一样,文中没有给出完整的可直接执行的源程序。

Fortran与VC++或C语言的混合编程应用越来越广泛。随着Linux操作系统被越来越多的人接受以及大规模数值计算的需求,Fortran与VC++或C语言混合编程在Linux操作系统下的应用也越来越多。因为Fortran与VC++和C语言混合编程差别不大,所以这里下面我们仅讨论Fortran与C语言的混合编程问题且仅限于C语言程序调用Fortran语言程序。由于目前有关这类混合语言编程的可以直接运行并且能够清晰地说明混合编程的过程的可参考的源程序比较缺少,因此本文结合所研究的C语言程序在不同操作系统下调用Fortran语言程序的方法的基础上给出了完整的可直接执行的混合语言编程源程序。

1 C与Fortran的混合编程语法

1.1 Windows操作系统下的混合语言编程语法

本文所用的Windows操作系统下的软件环境是在计算机上同时安装了Microsoft Visual C++6.0和Compaq Visual Fortran 6.0(或升级至6.6)。

命名规则:需要注意的是Fortran语言不区分字母的大小写,而C语言中是严格区分字母的大小写的。Fortran语言中的subroutine或function的名字在C语言中声明或调用时是以该名称的全部小写方式实现的。例如,Fortran编写的subroutine Gauss_Integration在C语言中声明时应为extern void gauss_integration();。该例子表明Fortran语言中的subroutine对应C语言中的void函数。Fortran中的函数对应C语言中同类型的函数。不同的是C语言中没有自带复数类型。因此对于Fortran中的复数类型的函数或变量,在C语言中必须自己建立复数结构如下来与Fortran语言中的复数类型匹配。

参数传递:在Fortran语言中所有参数都是以传址的方式传递的。而C语言中默认只有数组是以传址的方式传递的,其它参数都以传值的方式传递。因为C语言对指针操作非常方便,所以我们推荐在C语言调用Fortran语言的subroutine或function时所有的参数都采用传址的方式。这样做的好处是可以减少传递错误的发生。参数传递中特别需要注意的是数组的传递。首先是Fortran中的数组下标默认是从1开始的,而C语言中是从0开始的。其次,Fortran与C语言中的数组在内存中的存储方式是不同的。Fortran中数组是以列为主排列的,而C语言中的数组是以行为主排列的。例如一个二维数组在Fortran语言中该数组在内存中的存储方式为,(11,21,12,22),而在C语言中的存储方式为,(11,21,12,22)。关于这方面的详细描述可以参考文献[3,9]。Fortran中的全局变量传递到C语言中有两种方式。一种方法是利用Fortran语言的common语句,它对应C语言中同名的结构。例如common/examp3/number,对应C语言中的结构extern struct examp3;。另一种方式就是用module的方式。例如,module examp/real rnumber1/end module examp(这里/表示回车换行)对应C语言中的全局变量extern float EXAMP_mp_NUMBER1;。该例子说明两点,一是module方式的全局变量在C语言中除字母mp小写外,其它部分必须大写。二是Fortran中的real类型与C语言中的float相对等,而real*8(或double precision)与C语言中的double类型相对应。

此外,需要补充的是文献[1]中举例说明Fortran中的type类型与C语言中的结构对应。但是遗憾的是作者多次试验都没有成功。至今也没有在文献中或网络上发现有这方面成功的案例。

1.2 Linux操作系统下混合语言编程语法

在Windows操作系统下的Visual Fortran 6.0和VC++6.0编译器中所编写的C语言程序调用Fortran语言程序的混合语言编程程序不能直接在Linux操作系统下运行。针对不同的Linux操作系统混合编程语法也会略有不同。这里以Openuse 10.2,Fedora release 9和Centos release 4.5为例来简要介绍Linux操作系统下C语言程序调用Fortran语言程序的混合语言编程语法。重点是实用性。

首先是Windows操作系统下C语言程序中常用的以下头文件在Linux操作系统下一般是不需要的。

#include;#include;#include

而头文件math.h在两个系统中当用到特定的数学函数时都是需要的

其次,在采用编译器默认选项的情况下Windows操作系统中C语言程序调用的Fortran语言所编写的函数名在Linux操作系统中必须在该函数名后加一下划线。例如,Window操作系统中C语言程序调用的Fortran语言所编写的函数名为gauss_integration,那么该函数在Linux操作系统下的函数名应为gauss_integration_。当C语言程序调用Fortran语言程序时如果所有参数都采用传址方式传递的话,在Linux操作系统下对应函数的参数传递部分与在Windows操作系统下的情形完全相同,不需要做任何修改。

最后,必须注意的是在Linux操作系统下连接C语言程序的目标文件和Fortran语言程序的目标文件时最好使用编译器gfortran。否则的话,将发生Fortran程序中write,read等命令无法识别的错误。

2 C与Fortran混合语言编程实例

Windows操作系统下的源程序

在Windows操作系统下安装编译器Microsoft Visual C++6.0和Compaq Visual Fortran 6.0。然后建立一个win32 console application类型的project,把以上两个源程序文件加入到该project中即可编译运行。运行结果如下:

3 Linux操作系统下的源程序

C语言程序调用的Fortran语言程序c_call_for.f90与上面Windows系统下的文件完全相同,不需要做任何变动。

在Linux操作系统下,作者还没有成功地实现Windows操作系统下已经实现的全局变量传递,例如Windows系统下的number和number1。全局变量在C语言程序和Fortran语言程序间的传递可以间接地通过函数参数传递来实现。即全局变量传递成功与否对C和Fortran语言混合语言编程影响不大。

上面的程序在Openuse 10.2,Fedora release 9和Centos release 4.5三个Linux版本下都成功地运行过。在每个版本下都必须同时安装cc和gfortran编译器。对于本例的编译过程如下,

4 结束语

通过多次数值试验深入探索和研究了Windows操作系统和Linux操作系统下C语言程序调用Fortran语言程序的混合语言编程过程和技巧。文中以完整实例说明了在这两个不同操作系统下实现C与Fortran语言混合语言编程的区别与联系。所编写的完整实例有助于理解和实现混合语言编程,从而提高学习和应用C与Fortran语言混合语言编程的工作效率。该实例具有很好的通用性,只要稍加修改即可被参考者所利用。

参考文献

[1]Programming with Mixed Languages[R].Compaq Visual Fortran Version 6.6 online documentation,2001.

[2]肖晓玲,卢正鼎,张翔.VC与Fortran混合语言编程[J].江汉石油学院学报,2000,22(2):71-74.

[3]周振红,颜国红,吴虹娟.Fortran与VisualC++混合编程研究[J].武汉大学学报,2001,34(2):84-87.

[4]简建勇,曹志宇,燕乔.混合语言编程在有限元法中的应用[J].岩土力学,2003,24(增1):140-142.

[5]黄芝平,戴路,杨波.VC++6.0与PowerStation 4.0混合语言编程[J].微计算机信息2001,17-1:67-68.

[6]张向强,陈志英.Visual C++与Fortran的混编[J].计算机工程,2001,27(1):160-161.

[7]章大勇,郑海.VC++与Fortran混合编程方法研究[J].计算机工程与设计,2006,27(12):2246-2247.

[8]亓雪冬,仝兆岐,何潮观.Linux环境中Fortran与C混合编程研究[J].计算机工程与设计,2008,29(9):2378-2380.

调用程序 篇5

“静态网页”有很多优缺点。没有后台数据库,缺乏数据库的支持,此类网页在网站制作和维护方面工作量很大,而且对于维护人员的专业要求也较高。因此当网站信息量很大的时候,依靠静态网页制作就比较困难,而且维护起来也很不方便。静态网页内容固定,不含程序和数据交互。没有数据交互功能,所以网页之间的数据信息传递无法实现,导致网页功能方面受到了很大的限制。静态网页的内容都是保存在网站服务器上的,每个网页都是一个独立的文件,所以在安全性上要比“动态网页”要高,它不会受程序相关漏洞的影响,也不会因数据库出错而导致网站无法访问。因为静是运行于客户端的程序,不需要连接数据库,所以浏览速度开,节省了服务器的资源。如html页、Flash、Java Script、VBScript等等,它们是相对静止内容不变。

在网站设计的时候,除了“静态网页”外,我们还使用“动态网页”。“动态网页”通常使用的语言是:超文本标记语言+ASP或超文本标记语言+PHP或超文本标记语言+JSP等。“动态网页”当客户端向服务端发送请求后,在服务器端解释、运行,它们会随不同客户、不同时间,返回不同的网页,如ASP、PHP、JSP、ASPnet、CGI等。

在做网站设计的时候,为了让网站功能、设计更加方便,更多的时候,采用动态与静态想结合的方式。为了一些特殊的功能设计需求,通常会将网页内容生成静态页面,这样在满足了设计需求后,也造成了一些麻烦,举例来说,当主页LOGO、菜单等内容发生变化后,如何将变化的内容适用于所有的链接页面,如果都是动态页面则无所谓,但如果生成的子页面是静态页面,他的内容是不会发生变化的,那么当这些内容变化后,子页面也让跟着变,如何来实现?

现在以ASP为例,实现如何在HTML文件中调用ASP代码完成数据库的调用。

因为HTML页面不支持调用ASP,所以在HTML页面中,使用如下代码:

<script language="javascript"src="ASP文件名.asp"></script>来解决HTML页面调用ASP文件。因为HTML不解释执行,所以调用了ASP后,为了让ASP文件能正常解释执行,用以下代码编写ASP文件。代码如下:

通过以上两段代码,轻松实现了在HTML文件中调用ASP代码。

参考文献

[1]黄明,《ASP信息系统设计与开发实例》[J],机械工业出版社,12-15

[2]覃剑锋,张钢,《ASP网站建设专家》[J],机械工业出版社8-11

调用程序 篇6

数据库软件是目前应用较为广泛的软件之一, 由于信息数据技术的发展, 为数据提供了更为方便与快捷的存储以及调用方式。电子化设备普及让数据库使用平台更加广泛, 也让数据形式更加多样化。但是, 面临用户日益提高的需求, 计算机平台基础的数据库软件开发也遇到了一些问题。在对数据进行处理的过程中, 如何有效进行智能化管理, 在存储和调用过程中如何改变传统的手工录入方式, 让存储与调用都更加智能化, 是目前数据库软件遇到的主要问题。基于此, 将通过研究数据库软件的程序开发原理, 并结合现有技术理论, 探讨如何有效地完成数据存储与调用指令设计。

1 数据库软件的特点与技术分析

数据库软件是目前计算机数据处理中最为常用的软件之一, 利用其强大的数据处理功能, 可以很好地实现数据存储、数据调用以及数据分析等功能。对于目前的数据处理功能而言, 主要集中在存储和调用两个方面。那么, 基于计算机高级语言研发的数据库软件具有怎样的特点呢?

1.1 数据库软件的特点分析

数据库软件具有数据处理能力强、存储快捷、调用方便等诸多优点, 在目前的数据处理领域, 数据库软件是非常有价值的数据处理软件, 因为数据库软件的出现改变了对于数据处理的传统理解, 并且能够将处理效率最大限度地提高。此外, 由于数据库软件是基于计算机开发的, 针对计算机就可以对数据库进行进一步地开发, 例如加入声控或者数显扫描等功能, 从而让数据库软件的功能更加强大, 实现全面地智能化与人性化操作。

1.2 数据库软件的技术分析

数据库软件是基于计算机平台开发的数据处理功能软件, 其功能强大, 保证了数据处理的高效性和智能化。但是, 随着人们对于数据处理的要求逐步提升, 传统的数据库软件处理方式也出现了一定的改进和创新。在技术应用方面, 远程通信, 单片机的结合以及智能化方式都有了进一步的改善。总之, 对于数据库软件而言, 方便快捷地数据处理, 是未来的发展需求, 也是保证数据库软件能够持续应用的基本需求。

在智能化领域, 进行智能化存储, 以及智能化调用, 是未来进一步开发和设计的目标。通过目前的理论基础, 已经可以引入扫描以及声音录入的方式, 这两者均比较适合未来的数据库软件开发。在智能化的发展过程中, 数据库软件可利用声控和图像智能识别的方式, 来进行数据的存储和录入, 并进行声控的调用, 从而简化用户的操作, 实现智能化的数据库软件应用。

2 数据库程序开发的存储指令设计分析

计算机技术的发展, 为人们的生活和工作带来了巨大的变化, 传统的一些工作和生活方式因此不再适用于现代社会的发展。因此, 在现代社会中, 基于计算机技术的软件开发越来越普及, 数据库软件就是其中一款功能强大的软件。

对于数据库软件的存储指令设计而言, 需要进行怎样的技术研发呢?在未来的发展过程中, 又可以采用哪些智能化的方式, 使数据库软件的存储指令更加人性化呢?

2.1 分析数据库软件的存储指令设计原理

计算机技术的原理是将所有的内容数据化, 因此可以说计算机时代就是数据时代, 任何数据都可以进行相互的转换, 任何内容也都可以采用数据的形式呈现。那么, 数据库软件就有了技术原理的支持。

对于数据库软件中的存储指令设计而言, 一般的技术原理可以这样理解。

2.1.1 数据的存储原理

将内容以数据的方式进行录入, 占据虚拟的数据库软件空间, 就实现了初步录入和存储操作。可以针对数据的存储模式和存储需求, 对数据的保存时间进行设定。在一些大型的数据库软件中, 一般情况下数据都不是永久保存的, 尤其是一些网页类的数据库。在网页访问的过程中, 都会生成访问日志, 而访问日志的数据库就不会永久保存, 因为这样的数据没有长久保存的价值, 再者数据过多会造成数据库软件存储过载。因此, 存储既是为了数据的保存, 也是为了让数据更加有用。

2.1.2 数据的重叠与替代原理

如果相同的数据分别进行了存储, 数据库软件一般会分存储区进行存储;但是一个存储区内被相同的数据多次存储, 那么该存储区内将只保留最后一次录入的结果。因此, 在数据库软件进行数据存储的过程中, 一定要对指令进行相应的设定。对于数据的识别, 仅针对存储区域进行识别, 而不是对数据的等同性进行识别。这样的设计方式非常适合数据库的存储功能, 因为即使重复数据是相对普遍存在的, 其存储空间却是唯一的。

2.2 数据库软件的存储指令开发潜力探究

虽然目前的数据库软件存储功能已经非常强大, 对于内容的识别能力也具有一定智能性, 但是存在一个问题无法解决——如何将录入和存储直接连接, 从而保证录入的高效性。

由于传统的数据录入模式依然普遍采用手工方式, 非常消耗时间, 造成了工作效率低下等问题。因此, 数据库软件的操作过程依然具有非常巨大的潜力。例如, 可以实现智能化录入, 将人工录入方式转换成自动录入与存储方式, 从而减少了人工成本, 也提高了工作效率和准确性。

2.3 基于智能化理论的数据库存储指令开发分析

目前, 数据库软件的开发前景非常巨大。因为, 目前的存储过程更多是基于手工录入的方式, 存在较大的问题。第一是手工录入的工作量相对较大, 过程太复杂, 容易造成操作者的疲劳;第二是在使用过程中, 一旦操作者出现失误, 就会造成存储的数据出现错误, 影响整个数据库地正常使用。因此, 对于目前的数据库软件而言, 存储的效率和准确性需要提高。

基于智能化的技术理论, 以及目前计算机技术的发展水平, 完全可以引入扫描的方式进行存储。因为将数据数字化通常都是采用手工录入的模式实现存储。但是, 如果可以将数据库软件与扫描软件结合, 就可以利用扫描仪对传统数据进行扫描, 然后在数据库软件中设计相应的转换软件, 将扫描的结果直接录入, 从而降低存储操作的工作量, 并且可以实现智能化以及高效化相结合。

总之, 对于数据存储指令的设计, 首先要明确其研发的原理, 其次要通过良好的设计理念, 使其更加智能化和人性化, 才能保证存储指令更好地服务于使用者, 也让数据库软件更加智能化和高效化。

3 数据库程序开发的调用指令设计分析

对于数据库软件的调用指令, 应该如何进行合理设计, 才能保证调用的可行性并且提高工作效率呢?以下将进行详细分析。

3.1 数据库软件调用指令的原理分析

在数据库的设计过程中, 为了方便数据的查找, 在数据库软件中加入了调用语句。数据调用的方式非常高效和智能, 一般情况下是采用关键词或者关键词的方式进行调用。但是, 调用的前提是对数据进行存储。调用过程一般分为以下几个步骤。

3.1.1 输入关键词或者关键字

在定义关键词或者关键词的过程中, 一般都会进行数据提示或者设定。例如, 要查询一件衣服的价格, 就需要确定关键词, 一旦关键词确定就可以进行库内查找了。实际上, 查找的原理就是在库内进行文字匹配, 如果配对正确, 就可以通过调用语句, 将匹配正确的相关内容进行显示。这就是关键词或者关键词的调用方式。

3.1.2 数据调用匹配的原理分析

数据的匹配即是利用查找配对原理, 通过搜索功能, 将输入的关键词进行库内排重与查询, 一旦遇到匹配的内容就直接显示, 从而实现调用功能。

3.1.3 数据调用的显示原理

进行关键词或者关键词匹配之后, 利用调用语句, 将库内内容与关键词或者关键词进行匹配, 匹配后将与之关联的语句整体显示, 从而显示调用的语句。

3.2 数据库软件调用指令的智能化设计

目前数据库软件的调用功能非常强大, 但是操作的过程通常还是利用关键词或关键词进行查找, 而关键词或关键词通过操作者输入文字来获取。这方面还存在很大的发展空间, 比如, 如果可以使用声控的方式, 数据库软件的调用功能就会更加强大。因此, 加入声控的功能, 对于数据库软件的智能调用非常有价值。

4 结语

在使用数据库软件的过程中, 主要就是进行数据的存储以及调用, 两者在很大程度上决定了数据库软件的效率。虽然目前数据库软件的功能已经非常强大, 可以实现数据的任意存储以及调用, 但是依然存在很大的开发和设计空间。尤其是在智能化领域, 如何进行智能化存储, 以及智能化调用, 都需要进一步开发和设计。

调用程序 篇7

Forcal是一个轻量级嵌入式快速脚本,绿色免安装,不读写注册表。与其他脚本不同,Forcal以动态库的形式提供,核心库只有一个动态库文件Forcal32W.dll。Forcal非常小巧,动态库版本文件小于150K,静态库版本约260K~300K。

通常,使用各种高级语言如C/C++、C#、Delphi、FOR-TRAN等设计的程序,不能对源代码进行动态编译,Forcal可为所有这些应用程序增加对字符串源代码的动态编译功能。Forcal可用于各类数学软件的设计,也可用作报表处理、Web、组态软件、游戏等的脚本,具有很高的执行效率。

Forcal软件的构成是高度组合式的。Forcal32W.dll是核心库,在此基础上可设计种类繁多的Forcal扩展动态库,Forcal程序由Forcal32W.dll及零个或任意多个Forcal扩展动态库提供支持。根据完成的功能不同,一个Forcal程序的规模(包括所有支持模块)可以很小(例如只有几百K),也可以非常大。

Forcal软件系统为应用程序提供了多种支持方式,以下是比较典型的3种方式:

(1)仅由核心库Forcal32W.dll支持。此方式用户编程难度较大,但若软件功能简单,此方式仍不失为最佳选择。

(2)由核心库Forcal32W.dll和Forcal模块化编译运行库MForcal32W.dll支持。此方式可充分使用Forcal软件系统的功能,编程难度也较小,在易用性及效率上可获得极佳的平衡。在设计大中型的软件系统时,这应是最佳选择。

(3)由实用库GForcal32W.dll及必须的支持库Forcal32W.dll、MForcal32W.dll和Fc Data32W.dll提供支持。这种方式编程难度最小,且可获得Forcal软件系统的全面支持,但稍稍损失一点运行效率,不过多数情况下用户感觉不到效率的下降,故这是最为推荐的使用方式。即采用这种使用方式。

将在Delphi 2009程序中调用GForcal及几个Forcal扩展库(Forcal 9.0版本),动态绘制函数图形,将着重讨论加载GForcal及扩展库的基础技术问题。

2 GForcal

GForcal32W.dll是一个通用的Forcal脚本系统(简称GForcal)。GForcal可看作应用程序与Forcal之间的一个接口,但GForcal简化了Forcal脚本的使用。

GForcal至少需要3个dll的支持:Forcal核心库Forcal32W.dll、Forcal模块化编译运行库MForcal32W.dll和Forcal数据类型扩展动态库Fc Data32W.dll。这3个支持库的位置比较灵活:(1)与GForcal32W.dll放在一起;(2)放在GForcal32W.dll所在文件夹的子文件夹“Fc Dll”中;(3)放在Windows搜索目录。

通过GForcal,可动态地加载和卸载任意多个Forcal扩展库,灵活地使用Forcal脚本系统。

GForcal支持在多线程中使用Forcal的功能。GForcal内置了一个Forcal运行监视器,以方便用户从无限循环中退出。

任意程序加载GForcal后,可以动态定义函数,供程序使用;动态对指定的对象进行操作,并获得结果;无限的功能扩展。

3 Delphi程序结构及功能实现

Delphi程序功能很简单,程序定时向Forcal系统发送一组数据(xi,yi),Forcal系统接收数据,然后动态绘制数据的二维图形。本程序对数据的动态采集及显示有重要的参考意义。

Delphi程序启动在界面中有两个Memo窗口和一个按钮。左面的Memo1窗口接收Forcal源代码,右面的Memo2窗口输出一些结果。Forcal源代码中定义了两个函数Set Max和Set XY,这两个函数由Delphi调用,Set Max用于设置要发送的数据组数,Set XY用于每隔一定时间向Forcal系统发送一组数据。

点击按钮时,Delphi程序每隔0.2s向Forcal系统发送一组数据,共发送30组数据,主要步骤如下:

(1)编译Memo1窗口的Forcal源代码。

(2)执行编译后得到的Forcal模块。

(3)查找Forcal中的全局函数Set Max,由该函数设置要发送的数据组数。

(4)查找Forcal中的全局函数Set XY,每隔0.2s向Forcal系统发送一组数据(xi,yi)。其中xi初值为0,每次循环xi增加0.5,yi=xi*sin(xi),共循环30次。数据(xi,yi)同时发送到Memo2窗口。

(5)销毁第一步中编译得到的Forcal模块。

点击按钮后,Delphi程序界面如图1所示,Forcal动态绘制的图形如图2所示。

本程序运行需要的Forcal库如下:

(1)GForcal32W.dll:该库是本程序唯一直接加载的Forcal接口库。

(2)Forcal32W.dll、MForcal32W.dll和Fc Data32W.dll:这3个是GForcal32W.dll的支持库,由GForcal32W.dll自动搜索加载。

(3)Fc Math32W.dll和FC2D32W.dll:这两个库是Forcal扩展库,Fc Math32W.dll为Forcal脚本提供了数组支持,FC2D32W.dll用于通过Forcal脚本动态绘制函数图形。这两个库通过函数Load Dll加载,用完后用函数Free Dll卸载。

4 Delphi源代码

Delphi源代码如下,注意函数TForm1.Form Create和TForm1.Form Destroy分别负责程序对Forcal脚本系统的初始化和卸载等工作:

5 用Forcal脚本加强动态数据的处理及动态图形绘制

本例中用到的Forcal源代码如下:

将以上代码复制到左面的Memo1窗口,点击按钮,观察图形,如图3所示。

6 结语

通过实例介绍了如何在Delphi程序中调用GForcal及几个Forcal扩展库,动态绘制函数图形,并着重讨论了加载GForcal及扩展库的基础技术问题。本程序对数据的动态采集及显示有重要的参考意义。

参考文献

上一篇:桩基项目下一篇:电网电压波动