- 浏览: 19400 次
最新评论
Fortran调用Matlab
2011年12月27日
【试验环境】Windows 2003 server std,matlab r2007b,MinGW gcc 4.2 (sjlj)。Visual Studio 2005
【试验任务】实现在fortran程序中调用matlab编译生成的DLL。
【试验步骤】首先,创建一个简单的m代码,这里用拙作《深入浅出matlab7.x混合编程》中用到的mcctest01.m作为例子,它是一个很简单的m方程,程序代码如下:
代码:function mcctest01
% MCCTEST01 Create some data and draw a 2D x-y plot
% mcctest01 is used to demonstrates how to convert M-functions into
% library files and how to use created library files with MFC
% applications.
%
% Inputs:
% None
%
% Output:
% None
%
% Copyright (c) 2005 Dong Weiguo
% create data
x = 0:.01:20;
y = x.*sin(x);
% draw a plot
plot(x,y);
xlabel('x');
ylabel('y');
然后在matlab中编译mcctest01,生成libmcctest01.dll。注意,如果这是你第一次在matlab中使用mcc命令,你需要先运行mbuild -setup来配置。我使用Visual Studio 2005编译器。在matlab中执行如下命令:
mcc -W cpplib:libmcctest01 -T link:lib mcctest01.m
这里假设matlab中的当前工作环境是$MATLAB\work。结果将会产生若干文件,我们需要拷贝如下四个文件到我们的Fortran源程序目录:
libmcctest01.h
libmcctest01.lib
libmcctest01.dll
libmcctest01.ctf
接下来的任务就是如何在fortran程序中调用libmcctest01.dll
Fortran无法直接使用动态链接库(或者有些版本的fortran编译器,比如PGI,或Visual Fortran等有相关的扩展,不过我不了解)。长话短说,在fortran程序中,我们可以通过调用c语言的方式间接调用dll,具体的做法是我们为调用dll中的函数,另外在写一个和fortran兼容的c或c++语言的wrapper函数。这里牵涉到fortran和c/c++的混合编程,主要有两点需要注意的:
1. Fortran程序中函数的参数是以地址的方式传递的。也就是说类似于
subroutine foo(x, y, z)
real x, y, z
其等效的C语言函数声明则类似
void foo( float* x, float* y, float* z);
2. 有些fortran编译器比如g77,在编译函数后会在函数名的后面在多加一个下划线“_",也就是上面的subroutine foo编译后,函数名就变成了foo_。换句话说,如果在fortran中用
call foo(...)
调用foo子函数,其实是找foo_。
下面给出针对于我们的例子,也就是libmcctest01.dll中mcctest01函数的调用,一个可行的C++语言的wrapper函数:
// File: mcctest01wrap.cpp
// Description: A simple testing c++ souce file. Two functions
// are defined, which will be called in a FORTRAN 77 code.
//
// History: Created on 16 January, 2006
// Created by: Dong Weiguo
//////////////////////////////////////////////////////////////
#include "libmcctest01.h"
// By default, most of fortran compilers would add an
// undrescore at the end of function name
// So let's emulate this bahavior
extern "C" void mymccfunc_()
{
libmcctest01Initialize();
mlxMcctest01(0, NULL, 0, NULL);
std::cout
ress any key to quit!" 这个例子的fortran主程序:
! A test program to demonstrate how to call c++
! functions from a Fortran program.
! Synopsis: f77cpptst
! History: 16 January, 2006
! Created by: Dong Weiguo
program f77cpptst
call mymccfunc()
stop
end
可以看出,程序非常简单,就是调用wrapper函数。
*************************************************
* *
* 一、Visual Fortran中使用Matlab引擎 *
* *
*************************************************
source:http://www.simwe.com/cgi-bin/ut/topic_show.cgi?id=16634&h=1&bpg=1&age=-1
#1.安装
软件版本:
Compaq Visual Fortran(以下简称CVF)6.5
Matlab 6.1
安装路径:
CVF: C:\Program Files\Microsoft Visual Studio
Matlab: D:\matlab
#2.配置mex
在matlab下运行命令mex
发表评论
-
AJAX 跨域总结
2012-01-20 10:11 623AJAX 跨域总结 2010年12月23日 AJAX的使 ... -
代码段
2012-01-20 10:11 568代码段 2010年11月18日 1. 页面 js初始化: ... -
转.搞定百度图片防盗链
2012-01-20 10:11 1439转.搞定百度图片防盗链 2011年02月11日 提到可以 ... -
Comet基于iframe的服务器推送(Server Push)例子
2012-01-20 10:11 670Comet基于iframe的服务器推送(Server Push ... -
AJAX 长轮询
2012-01-20 10:11 1323AJAX 长轮询 2010年06月24 ... -
中班下学期班务工作计划
2012-01-19 15:12 849中班下学期班务工作计划 2011年02月26日 2011 ... -
2010年大班上学期工作计划
2012-01-19 15:12 7902010年大班上学期工作计 ... -
幼儿园大班工作计划
2012-01-19 15:12 713幼儿园大班工作计划 20 ... -
大班下学期个人工作计划
2012-01-19 15:11 1310大班下学期个人工作计 ... -
大班下学期个人工作计划
2012-01-19 15:11 996大班下学期个人工作计 ... -
Linux下NFS服务器的配置
2012-01-17 04:59 620Linux下NFS服务器的配置 2010年10月29日 ... -
Pthread 与 Linux
2012-01-17 04:59 717Pthread 与 Linux 2010年10月 ... -
C/C++ 的思索 C++之父“访谈录”
2012-01-17 04:59 652C/C++ 的思索 C++之父“访 ... -
联想K31笔记本完全拆解,装不回去了。想做个电视机或者显示器
2012-01-17 04:59 1361联想K31笔记本完全拆解,装不回去了。想做个电视机或者显示器 ... -
FLEX网站收集
2012-01-16 03:50 829FLEX网站收集 2009年12月19日 1.FLEX网 ... -
FLEX 网站
2012-01-16 03:50 505FLEX 网站 2010年09月19日 ... -
自己用的Flex
2012-01-16 03:49 629自己用的Flex 2010年04月1 ... -
FLEX做的网站
2012-01-16 03:49 640FLEX做的网站 2011年05月1 ... -
MyEclipse+Flex+Blzeds入门浅谈
2012-01-16 03:49 579MyEclipse+Flex+Blzeds入门浅谈 2011 ...
相关推荐
书中详细介绍了用fortran调用MATLAB地方法,很实用哦
fortran 调用matlab画图程序
Fortran调用matlab作图示例.doc
matlab与fortran的接口技术,怎样互相调用各自的程序段进行计算。
FORTRAN程序调用MATLAB引擎实现计算可视化
FORTRAN程序调用MATLAB引擎实现计算可视化介绍
FORTRAN程序调用MATLAB引擎实现计算可视化介绍
.
.
探索了 FORTRAN程序调用MAT LAB 函数的基本原理 ,用实例介绍了调 用MAT LAB 引擎函数 ,实现 FORTRAN 程序计算结果的可视化过程。并给出如何编 译带有MAT LAB 引擎函数的 FORTRAN 程序的具体技术。
matlab调用fortran,matlab调用fortran程序.zip
matlab调用fortran,matlab调用fortran程序源码
这个被大量注释的 Fortran 程序是一个简单的例子,说明如何从 Fortran 调用 MATLAB .m 文件。 如果这是您第一次尝试,则适合。 基本机制是将 C 编译的 .m 打包成 .dll 并从 Fortran 链接到它。 解释了参数和结果...
MATLAB 编译器(v4、R14 及更高版本)可以将 MATLAB 代码打包到可执行文件或 C/C++ 共享库中。 但是,从 Fortran 调用 C 共享库可能很困难。... 这是如何从 Fortran 调用 MATLAB 编译器生成的 C 共享库的示例。
介绍和分析了Matlab与Fortran混合编程的两种方式,即利用Mex文件和利用Matlab引擎;给出了其具体实现方法,并讨论了各自的优缺点和适用情况;给出了一个物探数据可视化的应用实例。...如Fortran中要调用的Ma
matlab开发-来自FortrancalMatlabCompilerSharedLibrary。混合语言示例:从Fortran调用Matlab编译器C共享库
matlab调用fortan学习资料
matlab调用Fortran生成的dll
vc6调用matlab的生成的sharelibrary示例 sharelibrary 由matlab的m文件生成