fortran-关于FORTRAN调用matlab出现问题,无从下手,跪求大神指点!

问题描述

关于FORTRAN调用matlab出现问题,无从下手,跪求大神指点!

首先说明,我用的是VS2008平台,intel fortran安装在该平台下,matlab为2010a版本
。调用了matlab中的libeng.lib libmat.lib libmex.lib libmx.lib库文件。程序可以编译,但是运行时候出错。代码
!!matlab函数调用模块
!!!!!
module matlab
implicit none

integer ep !指针,用于指向打开的matlab
integer mstatus !非指针,记录命令执行的结果是否有效

integer,external::engOpen,engPutVariable,engGetVariable,engEvalString,engClose
integer,external::mxCreateDoubleMatrix,mxGetPr

contains
!!======================================
!!打开matlab应用程序
subroutine startmatlab()

implicit none
write(*,*)"正在打开matlab应用程序,请稍后......."
ep = engOpen('matlab')
if(ep==0)then
write(*,*)"未能打开matlab应用程序,程序结束"
stop
else
write(*,*)"成功打开matlab应用程序窗口"
endif

endsubroutine startmatlab
!!===================================
!!关闭matlab应用程序
subroutine closematlab()

implicit none
write(*,*)"正在关闭matlab窗口,请稍后......"
mstatus = engClose(ep)
if(mstatus /=0 )then
write(*,*)"未能关闭matlab程序窗口,程序结束"
stop
else
write(*,*)"成功关闭matlab的程序窗口"
endif

endsubroutine closematlab
!!========================================
!!在matlab中执行命令
subroutine mc(string)

implicit none
character(*) string
print ,"正在matlab中计算语句: ",string
if(engEvalString(ep,string) /=0 )then

!!!engEvalString发送命令让 Matlab 执行,参数 ep 为函数 engOpen 返回的引擎指针,字符串 string 为要 matlab 执行的命令。
write(6,
) 'engEvalString failed'
stop
endif
endsubroutine mc
!!==========================================
!!将fortran中的矩阵送到matlab中去
subroutine f2m(fdata,mstring,row,col)

implicit none
integer row,col
real(8) fdata(1:row,1:col)
character(*)mstring
integer ptemp
ptemp = mxCreateDoubleMatrix(row,col,0) !!!mxCreatDoubleMatrix新建一个double 类型数组
if(ptemp==0)then
write(*,*)"无法申请内存"
stop
endif
call mxCopyReal8ToPtr(fdata,mxGetPr(ptemp),row*col)
!!!mxCopyReal8ToPtr将一个Fortran语言的实数类型数组中的数据复制到某个阵列的实数部分或虚数部分中。
!!!fdata为fortran语言的实数类型数组
!!!mxGetPr(ptemp)为指向某个阵列的实数或虚数部分的数据的指针;mxGetPr用来获取矩阵指针
!!!row*col为希望复制的元素的个数
mstatus = engPutVariable(ep,mstring,ptemp) !!!向 Matlab 引擎工作空间写入变量。
call mxDestroyArray(ptemp) !!!释放内存

print *,"正在matlab中生成矩阵:      ",mstring

if(mstatus /= 0)then !!成功返回0
    write(*,*) 'engPutVariable failed'
    stop
endif

endsubroutine f2m
!!==============================================
!!将matlab中的矩阵输入到Fortran中
subroutine m2f(mstring,ddata,row,col)

integer row,col
real(8) ddata(row,col)
character(*)mstring

integer ptemp
ptemp = engGetVariable(ep,mstring) !!!获得当前 Matlab 窗口的显示 / 隐藏情况,可以调用函数:
call mxCopyPtrToReal8(mxGetPr(ptemp),ddata,row*col)
endsubroutine m2f

endmodule

!!=================================================
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
program main
use matlab
implicit none

integer,parameter :: ndata=10
real(8) x(ndata),y(ndata),z(ndata)
integer m
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!给x和y赋值
do m=1,ndata
x(m)=3.1415926587*(m-1)/(ndata-1)
y(m)=sin(x(m))
enddo
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!打开matlab
!call startmatlab()

!!将x和y输出到matlab
call f2m(x,"x",1,ndata)
call f2m(y,"y",1,ndata)

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!在matlab中画图
call mc("plot(x,y);title('y=sin(x)';xlable('x');ylable('y'))")

!!在matlab中计算
call mc("z=2*y")

!!将计算结果输出到fortran
call m2f("z",z,1,ndata)

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!在fortran中打印结果
print ," x "," y " ," z "
do m=1,ndata
write(
,"(G15.6,G15.6,G15.6)") x(m),y(m),z(m)
enddo

end program main

出错时指向 cookie = systime.ft_struct.dwLowDateTime;
cookie ^= systime.ft_struct.dwHighDateTime;

错误信息:“matlabtest.exe”: 已加载“C:WindowsSystem32ntdll.dll”

“matlabtest.exe”: 已加载“C:WindowsSystem32kernel32.dll”
“matlabtest.exe”: 已加载“C:WindowsSystem32KernelBase.dll”
matlabtest.exe 中的 0x000db346 处最可能的异常: 0xC0000005: 读取位置 0x000db346 时发生访问冲突
matlabtest.exe 中的 0x000db346 处未处理的异常: 0xC0000005: 读取位置 0x000db346 时发生访问冲突
。该怎么处理?求大神指点?先行谢过。
在线等答案。

时间: 2024-08-22 09:41:12

fortran-关于FORTRAN调用matlab出现问题,无从下手,跪求大神指点!的相关文章

vs2012+matlab2013-VS2012调用matlab2013出现问题。跪求大神指导啊

问题描述 VS2012调用matlab2013出现问题.跪求大神指导啊 函数代码: int main(int argc, char argv[]) { QApplication a(argc, argv); loSmoothing w; w.show(); Engine *ep; //定义matlab引擎指针 if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功. { cout <<"Can't start Matlab engine!"

通过反射找到了已经打开的窗体。怎么调用窗体中的方法,求大神指点。

问题描述 stringwindowsName="注册";IntPtrhandle=NativeMethods.FindWindow(null,windowsName);if(handle!=IntPtr.Zero){Formfrm=(Form)Form.FromHandle(handle);frm.Activate();//frm.Go(user);} 通过反射找到了已经打开的窗体.怎么调用窗体中的方法,求大神指点. 解决方案 解决方案二:我自己顶求关注解决方案三:Invoke解决方案

c#与BP神经网络MATLAB程序混合编程的问题。求大神指点

问题描述 正在做一个项目,需要用到c#与BP神经网络MATLAB程序混合编程.我看网上有好多种方法做.有的用deploytool做成动态链接库的,还有的用COM组件做的,还有的用什么交叉混合编程.求大神指点到底用什么方法做呢??我现在只会用deploytool做成动态链接库,连接比较简单的m文件呢. 解决方案 解决方案二:用matlib将m文件编译成C#可用的dll.编译的时候选择编译类型为.net动态库解决方案三:编译的时候总会出现newoff出错,也就是说不能调用BP神经网络的工具箱,不知道

调用-自己写的一个php的PDO的类,有点问题,求大神指点

问题描述 自己写的一个php的PDO的类,有点问题,求大神指点 自己写的一个php的PDO的类,在调用的时候可以查询,插入的时候没有报错,但是插入没有成功,这是怎么回事.......... 这个是调用的类 <?php header("content-type:text/html;charset=utf-8"); class dbPdoManger { private $conn='';//连接数据库服务器的资源类型 private $host="";//主机地

c++-不调用任何库函数如何实现stat_word.求大神打救

问题描述 不调用任何库函数如何实现stat_word.求大神打救 请保证代码工整,关键部分请用注释对代码逻辑进行说明 不调用任何库函数实现stat_word,该函数的功能是从字符串str中统计单词个数,str完全由英文字母及空格符组成,连续出现的若干个非空格字符即为一个单词.(5分) int stat_word(const char* str); 解决方案 #include "stdafx.h" #include <iostream> #include <vector

matchtample-在类中调用 opencv 的matchTample函数时,出现错误,求大神指点

问题描述 在类中调用 opencv 的matchTample函数时,出现错误,求大神指点 上图的代码出现在我的LightDetect类的一个类函数里,但是我新建一个工程,直接在main函数里调用matchTample是没问题的.是不是因为在类函数里不能分配太多内存?希望各位大神多多指点 解决方案 http://www.pudn.com/downloads635/sourcecode/graph/opencv/detail2575751.html

php 用户而验证-跪求大神帮我指点迷津,授权验证代码,已经有思路,也设计出来了,就是不知道怎么调用,代码如下

问题描述 跪求大神帮我指点迷津,授权验证代码,已经有思路,也设计出来了,就是不知道怎么调用,代码如下 <?php $auth=http://g.xsscp.com/include/code1.php?url=$_SERVER['HTTP_HOST']"; <?php $url = "http://g.xsscp.com/include/code1.php?url=$_SERVER['HTTP_HOST']"; $html = file_get_contents($

python调用xml文件的时候,报出ExpatError求大神指点

问题描述 python调用xml文件的时候,报出ExpatError求大神指点 问题代码:import xml.dom.minidom#打开xml文件dom=xml.dom.minidom.parse(""C:Users***Desktopmyprogramlogin.xml"") 运行时,提示:Traceback (most recent call last): File ""C:Users***Desktopmyprogramtest_log

微信语音 jssdk-微信JSSDK调用播放音频接口为什么没有响应?求大神指点!!!!

问题描述 微信JSSDK调用播放音频接口为什么没有响应?求大神指点!!!! 在做微信语音播放的项目,可是调用后为什么没有动静?wx.ready方法已经通过了,可以alert,但是把检测的JS接口的wx.checkJsApi贴上去也没有什么反应?而且wx.playVoice的接口中localId是否是mediaid?代码如下:求指点.... var timestamp=""; var nonceStr=""; var signature=""; f