Matlab 打开MAT文件的脚本中存在分段错误
我想用fortran打开一个MAT文件,我按照。编译和链接不会出现任何错误或警告 这是生成文件:Matlab 打开MAT文件的脚本中存在分段错误,matlab,fortran,mat-file,Matlab,Fortran,Mat File,我想用fortran打开一个MAT文件,我按照。编译和链接不会出现任何错误或警告 这是生成文件: FC = gfortran FCFLAGS = -g -fcheck=all -Wall INCLUDES = -I/usr/local/matlab2008a/extern/include LFLAGS = -L/usr/local/matlab2008a/bin/glnxa64 LIBS = -lmat -lmx LDFLAGS = "-Wl,-rpath,/usr/local/matlab20
FC = gfortran
FCFLAGS = -g -fcheck=all -Wall
INCLUDES = -I/usr/local/matlab2008a/extern/include
LFLAGS = -L/usr/local/matlab2008a/bin/glnxa64
LIBS = -lmat -lmx
LDFLAGS = "-Wl,-rpath,/usr/local/matlab2008a/bin/glnxa64"
main: main.o param.o dmotifs.o ssa.o
$(FC) $(LFLAGS) $(LIBS) $(LDFLAGS) -o main main.o param.o dmotifs.o ssa.o
param.o: param.f90
$(FC) $(FCFLAGS) -c $<
dmotifs.o: dmotifs.f90 param.o
$(FC) $(FCFLAGS) -c $<
ssa.o: ssa.f90 dmotifs.o
$(FC) $(FCFLAGS) -c $<
main.o: main.f90 param.o dmotifs.o ssa.o
$(FC) -c -cpp $(FCFLAGS) $(INCLUDES) $<
clean:
rm -f *.o *.mod *.MOD
这是主要代码:
#include "fintrf.h"
PROGRAM main
USE ssa
IMPLICIT NONE
CHARACTER(LEN=6) :: argfun
TYPE(fhandle), DIMENSION(13) :: fmotifs
TYPE(funnames), DIMENSION(13) :: fnames
TYPE(PRM) p
REAL, DIMENSION(4) :: y0
REAL tf
REAL, ALLOCATABLE, DIMENSION(:) :: t
REAL, ALLOCATABLE, DIMENSION(:,:) :: y
TYPE(OPTIONS) opt
INTEGER fin
REAL nM2m
! MAT-FILE Declarations !
INTEGER*8 matOpen, matGetDir !, matGetNextVariable
INTEGER matGetVariableInfo
INTEGER mp, dir, adir(100), pa
INTEGER mxGetM, mxGetN, matClose
INTEGER ndir, i, clstat
CHARACTER*32 names(100) !, name
!===========================!
nM2m=1.355178815844751e3;
opt%numsample=2000
tf=1000000
call get_command_argument(1,argfun)
call makemotifs(fnames,fmotifs)
call getparamdef(p)
if(all(fnames(:)%fn .NE. argfun)) then
write(*,*) "No such motif: ",argfun
write(*,*) "Input format-> main <motifname>"
stop
else
fin=fchton(argfun)
y0=nint(nM2m*analys(p,argfun))
!*** ==> OPEN MAT-file <== ***!
mp=matOpen('./PRMS_lxr_29Apr15.mat','r')
if (mp .eq. 0) then
write(6,*) "Can't open MAT-file"
stop
end if
dir = matgetdir(mp, ndir)
if (dir .eq. 0) then
write(6,*) "Can't read MAT-file-directory."
stop
endif
call mxCopyPtrToPtrArray(dir, adir, ndir)
do 20 i=1,ndir
call mxCopyPtrToCharacter(adir(i), names(i), 32)
20 continue
write(6,*) 'Directory of Mat-file:'
do 30 i=1,ndir
write(6,*) names(i)
30 continue
write(6,*) 'Getting Header info from first array.'
pa = matGetVariableInfo(mp, names(1))
write(6,*) 'Retrieved ', names(1)
write(6,*) ' With size ', mxGetM(pa), '-by-', mxGetN(pa)
call mxDestroyArray(pa)
clstat=matClose(mp)
call gillespie(fmotifs(fin),y0,p,tf,opt,t,y)
end if
#包括“fintrf.h”
主程序
使用ssa
隐式无
字符(LEN=6)::argfun
类型(fhandle),尺寸(13)::fmotifs
类型(funnames),维度(13)::fnames
类型(PRM)p
实数,维度(4)::y0
真tf
实型,可分配,维度(:)::t
实型,可分配,维度(:,:)::y
类型(选项)选项
整鳍
实际nM2m
! MAT文件声明!
整数*8,matGetDir!,matGetNextVariable
整数matGetVariableInfo
整数mp,dir,adir(100),pa
整数mxGetM、mxGetN、matClose
整数ndir,i,clstat
字符*32个名称(100)!,名称
!===========================!
nM2m=1.355178815844751e3;
opt%numsample=2000
tf=1000000
调用get_命令_参数(1,argfun)
调用makemotif(fnames、fmotif)
调用getparamdef(p)
如果(全部(fnames(:)%fn.NE.argfun))那么
写(*,*)“没有这样的主题:”,argfun
写入(*,*)“输入格式->主”
停止
其他的
fin=fchton(argfun)
y0=nint(nM2m*分析(p,argfun))
!*** ==> 从错误消息中的地址长度打开MAT file,看起来您是在64位系统上
您已经以默认整数声明并存储了大多数mat*函数的结果。这可能只是一种32位类型。mat*函数实际上返回一个机器指针,在64位机器上为64位
链接到的示例代码可能采用32位平台
调整mat*函数和变量的声明,这些变量被适当地分配调用这些函数的结果。可能是整数(C_INTPTR_T)
,其中C_INTPTR_T来自ISO_C_绑定
mathworks提供了一种古老的C预处理器方法,用于指定相关类型(例如,matOpen的返回类型为mwPointer),预处理将其更改为适当的整数类型。就个人而言,我更喜欢使用我自己的接口,使用Fortran 2003的C互操作性功能编写。@AlexanderVogt他有一些回溯,第75行。仔细检查是否正确调用mat*例程,例如参数的数量及其类型。如果他们有一些带有显式接口的模块,那将是最好的。实际上,我正在放弃使用MAT文件。使用HDF5是一个更好的选择。为了公众的兴趣保留这篇文章。今天的MAT文件是HDF5文件的一种受限形式。在以后的编辑中,如果看不到实际代码,就很难诊断问题。@IanH这是实际代码。程序中使用的模块只有一些用于执行某些计算的子程序。即使我删除了需要这些模块的语句,也会发生此错误。指向中的注释“在DEC Alpha 64位平台上用整数替换整数*8”也可能很有用,因为它似乎建议在声明部分更改哪些变量/函数。谢谢。在我将指针声明的integer
替换为integer*8
之后,第82行仍然出现分段错误:调用mxCopyPtrToPtraray(dir,adir,ndir)
#include "fintrf.h"
PROGRAM main
USE ssa
IMPLICIT NONE
CHARACTER(LEN=6) :: argfun
TYPE(fhandle), DIMENSION(13) :: fmotifs
TYPE(funnames), DIMENSION(13) :: fnames
TYPE(PRM) p
REAL, DIMENSION(4) :: y0
REAL tf
REAL, ALLOCATABLE, DIMENSION(:) :: t
REAL, ALLOCATABLE, DIMENSION(:,:) :: y
TYPE(OPTIONS) opt
INTEGER fin
REAL nM2m
! MAT-FILE Declarations !
INTEGER*8 matOpen, matGetDir !, matGetNextVariable
INTEGER matGetVariableInfo
INTEGER mp, dir, adir(100), pa
INTEGER mxGetM, mxGetN, matClose
INTEGER ndir, i, clstat
CHARACTER*32 names(100) !, name
!===========================!
nM2m=1.355178815844751e3;
opt%numsample=2000
tf=1000000
call get_command_argument(1,argfun)
call makemotifs(fnames,fmotifs)
call getparamdef(p)
if(all(fnames(:)%fn .NE. argfun)) then
write(*,*) "No such motif: ",argfun
write(*,*) "Input format-> main <motifname>"
stop
else
fin=fchton(argfun)
y0=nint(nM2m*analys(p,argfun))
!*** ==> OPEN MAT-file <== ***!
mp=matOpen('./PRMS_lxr_29Apr15.mat','r')
if (mp .eq. 0) then
write(6,*) "Can't open MAT-file"
stop
end if
dir = matgetdir(mp, ndir)
if (dir .eq. 0) then
write(6,*) "Can't read MAT-file-directory."
stop
endif
call mxCopyPtrToPtrArray(dir, adir, ndir)
do 20 i=1,ndir
call mxCopyPtrToCharacter(adir(i), names(i), 32)
20 continue
write(6,*) 'Directory of Mat-file:'
do 30 i=1,ndir
write(6,*) names(i)
30 continue
write(6,*) 'Getting Header info from first array.'
pa = matGetVariableInfo(mp, names(1))
write(6,*) 'Retrieved ', names(1)
write(6,*) ' With size ', mxGetM(pa), '-by-', mxGetN(pa)
call mxDestroyArray(pa)
clstat=matClose(mp)
call gillespie(fmotifs(fin),y0,p,tf,opt,t,y)
end if