使用Fortran和C调用Metis API

我编写了以下代码,用于使用Fortran和C调用Metis,但仍然会出现分段错误。 代码的目标是为输入文件chanelElements执行分区。

 module metis_vars use iso_c_binding ! Variables integer :: ia, ic integer(kind=c_int) :: ne, nn integer(kind=c_int) :: ncommon, objval integer(kind=c_int) :: nparts integer(kind=c_int), allocatable, dimension(:) :: eptr, eind integer(kind=c_int), allocatable, dimension(:) :: epart, npart type(c_ptr) :: vwgt, vsize, tpwgts integer :: opts(0:40) interface subroutine METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize,ncommon,nparts,tpwgts,opts, & objval,epart,npart)bind(C, name="METIS_PartMeshDual") !subroutine METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize,nparts,tpwgts,opts,objval,epart,npart) & ! bind(C, name="METIS_PartMeshDual") ! use binding module use iso_c_binding ! declare variables with C++ types semantics integer(kind=c_int) :: ne, nn, ncommon, objval, nparts integer(kind=c_int), dimension(*) :: eptr, eind integer(kind=c_int), dimension(*) :: epart, npart type(c_ptr), value :: vwgt, vsize, tpwgts integer(kind=c_int) :: opts(0:40) ! printf('Hi'); end subroutine METIS_PartMeshDual end interface end module 

而主要的计划是

 program METIS_PART_1 use iso_c_binding use metis_vars implicit none open(unit=15, file="chanelData.dat") open(unit=1, file='channelElements.mesh') read(1,*), ne !ne = 2000 nn = ne * 8 allocate( eptr(ne+1), eind(8*ne) ) allocate( epart(ne), npart(nn) ) do ic=1,ne ia = (ic-1) * 8 + 1 read(1,*), eind(ia:ia+7) write(15,*), eind(ia:ia+7) ! print*, eind(ia:ia+7) eptr(ic) = ia ! write(15,*),' ia: ', ia enddo close(15) close(1) nparts = 4 ncommon = 2 vwgt = c_null_ptr vsize = c_null_ptr tpwgts = c_null_ptr !opts = c_null_ptr opts = 0 opts(0) = 1 opts(7) = 1 ! opts(0) = 1 ! opts(7) = 1 print*, ' -----------------------' print*, ' ne: ', ne print*, ' nn: ', nn call METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize,ncommon,nparts,tpwgts, & opts,objval,epart,npart) ! call METIS_PartMeshDual(ne,nn,eptr,eind,vwgt,vsize,nparts,tpwgts,opts,objval,& ! epart,npart) print*, ' objval: ', objval end program METIS_PART_1 

我编译使用并得到错误:

 fobeidat@envenio05:~/Metis/metis-5.1.0/graphs$ gfortran test3.f90 libmetis.a fobeidat@envenio05:~/Metis/metis-5.1.0/graphs$ ./a.out ----------------------- ne: 2000 nn: 16000 Segmentation fault (core dumped)