MATLAB与C_VisualC_混合编程的实现
然而%&’(&)自身所存在的某些缺点限制了它的应用范围。
(所以它的语言执行效率较$)%&’(&)是一种解释性语言,低,这对于实时性要求较高的领域,如自动控制、信号处理等,其实时效率是较差的。
因此它不能被用于(!)%&’(&)程序不能脱离其环境运行,开发商用软件。
程序可以被直接看到程序的源代码,因而不利于算法(*)
和数据的保密性。
可以在/01234&(/55中运用%+,-+.丰富的矩阵运算、绘图等功能。以下将看到,还有一种更为简便的方法实现%+,-+.和1/55的混合编程。
*#!利用%&’G<B实现%&’(&)与/55的混合编程
%&’E,<<(3公司推出的%&’G<B
MRN
(可于E’’L:00===#B&’EO
可以说是以上问题的最完美解决。它是第一’<<(3#G<B处获取)
个将%+,-+.的%文件转化到/55源程序的变换工具,它不但可将%文件转化为%>?文件、动态链接库文件,还能将既保持了%&’(&)%&’(&)的源代码译成同等功能的/55源代码。
的优良算法,又保持了/55的高执行效率。它完全可取代前述第一种混合编程方法。而1234&(%+,/S%使开发人员可以在目前流行的1/55T#"或1/55U#"的集成开发环境中完成%文件的编辑、编译、调试和运行。使用%+,/S%的集成开发环境不但可以对%文件进行编辑、调试、编译和连接成可%86>1+,
执行文件,还可以利用其提供的VW8(图形用户界面)进行程序界面制作,最后经一个优化器对代码进行优化处理,使代码质可以完全自动地将%文量更高。通过%86>1+集成开发环境,件编译、连接成可单独执行的>?>文件,使用非常方便。
在运用%&’G<B之前,首先应设置%&’G<B所对应的编译器类型、数据类型。在安装过程中,系统会让用户指定所使用的编译器类型和版本。现在%&’E,<<(3已推出%&’G<BR#T版本,其功能和使用方法都较以前的版本有很大的改进。软件安装并指定编译器后,编译、连接%文件的过程是完全自动化的。执行完成后,会生成一系列该项目的头文件、资源文件和/55源程序,同时生成可执行的>?>文件。用户可以在1/55开发环境中的适当位置插入转化的/55源程序,重新编译连接,也可以直接使用>?>文件。
下面用一个简单的三维绘图程序作为范例。
*%+,-+.与/01234&(/55语言混合编程的实现
为了充分利用%&’(&)的强大功能同时又能克服它的不
足,需要采用混合编程技术,即将%文件转化为可执行文件或。为此,有两种方法可以实现。动态链接库(6--文件)
*#$利用%+,-+.的+78标准实现混合编程
为扩充功能,%+,-+.提供了对/01234&(/55等语言的
即应用程序接口)。因此,+78标准(%+,-+.的一些工具可以协助语言编译器而形成92:;<=3下的动态链接库(文件。6--)为了生成6--文件,%+,-+.提供的/%>?#.+,是主要文件,它能自动调用所需工具对/语言进行处理,直接形成动态链接库,再/%>?#.+,实际上是通过特定语言编译器及链接器,加上自己的特有参数,最终生成可调用的动态链接库。
在/01234&(/55语言与%+,-+.语言的混合编程中,调用%+,-+.的内部函数,这种方法必须基于%+,-+.平台,由于%+,-+.的初始化完成后,便将一些系统数据加载到工作内存区,其中包括一些固有系统参数,以及一些内部函数,对一些常用的内部%+,-+.的操作是基于这些内部函数进行的。
命令可被%+,-+.直接翻译执行,而当需要解决一些比较繁琐的问题时,可使用%+,-+.的%文件或运用动态链接库
%&’(&)源程序:P4:G’2<:;CB<*;
;$!$)34)L(<’(
);34IP(LC&X3(!T);34)L(<’($!!));LG<(<I(LC&X3(!T)
经%&’G<BR#T翻译后的/55源程序如下:
6--文件。在/01234&(/55语言程序中调用的%+,-+.的内
部函数,必须先生成相应的动态链接库6--文件,否则此种方法无法实现。
由于%+,-+.只提供了对+@A8(美国国家标准协会)/的接口,所以/01234&(/55源程序必须满足+@A8/标准,并且)。其中必须包含头文件“BCD#E”以及主函数BCDF4:G’2<:()原型如下:BCDF4:G’2<:(
H<2;BCDF4:G’2<:(2:’:(E3,BD+II&JKL(E3MN,2:’:IE3,G<:3’
Y2:G(4;CZB&’(2)#EZ
YLI&[B&E;I3’<LY2:G(4;CZ;CB<*;#EZ
)\%B;CB<*;(
BD+II&JKLIE3MN)
其中:入口变量的个数;:(E3,:IE3分别为返回变量、L(E3MN、分别指向返回变量、入口变量的地址,LIE3MN为指针数组,BD+IO
)C[2:Q3G<LC
Y(2:C$Z;:0B&’G<BRT03&BL(C30B]P2(C30;CB<*;#BZG&((Q3’&GXQ)C[2:;
Y(2:C$Z;:0B&’G<BRT03&BL(C30B]P2(C30;CB<*;#BZ;<4)(C<(;Q:&I[2:^:&I[2:QH&(;2P_‘:&I[2:Q3C’a:&I[2:QH&(^"#";:&I[2:Q3C’^";
;<4)(C<(;Q:&I[<4’^:&I[<4’QH&(;2P(‘:&I[<4’Q3C’):&IO[<4’QH&(^"#";
:&I[<4’Q3C’^";
Y(2:C*Z;:0B&’G<BRT03&BL(C30B]P2(C30;CB<*;#BZY(2:CRZ;:0B&’G<BRT03&BL(C30B]P2(C30;CB<*;#BZ0B&’G<BRT03&BL(C30B]P2(C30;CB<*;#BZY(2:CTZ;:
(下转$"R页)
计算机工程与应用!"""#$"
I&J为BCD#E定义的%+,-+.下的矩阵类型。
为了在/01234&(/55源程序中调用%+,-+.函数,还必须在源程序中包含%+,-+.调用函数BCD/&((%+,-+.(),其原型如下:
CD’CI:2:’BCD/&((%+,-+.(
2:’:(E3,0K指明返回变量的个数K0BD+II&JKL(E3MN,2:’
:IE3,
BD+II&JKLIE3MN,G<:3’GE&I
);
0K返回变量的指针数组K00K指明入口变量的个数K00K入口变量的指针数组K0
0K要调用的函数名K0
KPG:Q:&BC
$"$