Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 打开MAT文件的脚本中存在分段错误_Matlab_Fortran_Mat File - Fatal编程技术网

Matlab 打开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

我想用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/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