Mex files crashes when run

17 visualizaciones (últimos 30 días)
Zhong Hao
Zhong Hao el 3 de Jun. de 2014
Editada: James Tursa el 3 de Jun. de 2014
Hi. I have written and compiled a mex file from a Fortran source code. However, I have problems running it as Matlab crashes whenever I run the mex file. Can anybody find out where is the problem?
My fortran source code is as follows.
#include "fintrf.h"
C======================================================================
#if 0
C
C add.F
C .F file needs to be preprocessed to generate .for equivalent
C
#endif
C
C add.f
C
C Adds two integers
C
C======================================================================
C Gateway routine
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
C Declarations
implicit none
C mexFunction arguments:
mwPointer plhs(*), prhs(*)
integer nlhs, nrhs
C Pointers to input/output mxArrays:
mwPointer a, b
mwPointer c
C Function Declerations
mwPointer mxGetData
a = mxGetData(prhs(1))
b = mxGetData(prhs(2))
c = mxGetData(plhs(1))
C Call the computational subroutine.
call add(%val(a), %val(b), %val(c))
return
end
C-----------------------------------------------------------------------
C Computational subroutine
subroutine add(a, b, c)
integer*8 a, b, c
c = a + b
return
end

Respuesta aceptada

James Tursa
James Tursa el 3 de Jun. de 2014
Editada: James Tursa el 3 de Jun. de 2014
The main problem is that you, the programmer, need to create the output mxArray plhs(1). When you run the mex routine the only mxArray variables you start with are the prhs(etc) variables. At that point in the code, prhs(1) is unallocated. MATLAB does not create the plhs(etc) outputs for you since it does not know what the output is supposed to be ... that is your job as the programmer. Also, you should check that the inputs are int64 type before you use them that way. E.g.,
C Gateway routine
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
C Declarations
implicit none
C mexFunction arguments:
mwPointer plhs(*), prhs(*)
integer nlhs, nrhs
C Pointers to input/output mxArrays:
mwPointer a, b
mwPointer c
C Function Declerations
mwPointer mxGetData
integer*4, external :: mxClassIDFromClassName
integer*4, external :: mxIsInt64
mwPointer, external :: mxGetNumberOfElements
mwPointer, external :: mxCreateNumericMatrix
mwSize :: one = 1
integer*4 :: mxREAL = 0
integer*4 classid
if( nrhs /= 2 .or. nlhs > 1 ) then
call mexErrMsgTxt("Need 2 inputs and at most 1 output")
endif
if( mxIsInt64(prhs(1))==0 .or. mxIsInt64(prhs(2))==0 ) then
call mexErrMsgTxt("Inputs must be int64 class")
endif
if( mxGetNumberOfElements(prhs(1)) /= 1 .or.
& mxGetNumberOfElements(prhs(2)) /= 1 ) then
call mexErrMsgTxt("Inputs must be scalar")
endif
classid = mxClassIDFromClassName("int64")
plhs(1) = mxCreateNumericMatrix(one,one,classid,mxREAL)
a = mxGetData(prhs(1))
b = mxGetData(prhs(2))
c = mxGetData(plhs(1))
C Call the computational subroutine.
call add(%val(a), %val(b), %val(c))
return
end
C-----------------------------------------------------------------------
C Computational subroutine
subroutine add(a, b, c)
integer*8 a, b, c
c = a + b
return
end

Más respuestas (0)

Categorías

Más información sobre COM Component Integration en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by