我有一个用C / C ++编写的库,它的开发人员声明它有一个Fortran接口。将启用该接口,包括头文件* .h并调用经典子例程。我想编译我的Fortran程序,也链接到该库。 该库已经过测试,并且可以正常使用。
这是主程序:
! Main program
INCLUDE 'pastix_fortran.h'
Program TEST
IMPLICIT NONE
call GO_PASTIX
END PROGRAM TEST
例程GO_PASTIX是
SUBROUTINE GO_PASTIX
IMPLICIT NONE
pastix_data_ptr_t :: pastix_data
integer :: pastix_comm
pastix_int_t :: n, rhs, ia(NCOLS+1), ja(NNZER)
pastix_float_t :: avals(NNZER), b(NROWS)
pastix_int_t :: perm(NROWS), invp(NROWS), iparm(64)
real*8 :: dparm(64)
call pastix_fortran(pastix_data,pastix_comm,n,ia,ja,avals,perm,invp,b,rhs,iparm,dparm)
END SUBROUTINE
在pastix_fortran.h文件中,定义了子程序中使用的变量类型:
#define PASTIX_INT_KIND 4
#define pastix_int_t INTEGER(kind=4)
#define pastix_uint_t unsigned INTEGER(kind=4)
#define pastix_data_ptr_t INTEGER(kind=4)
#define MPI_PASTIX_INT MPI_INTEGER4
#define pastix_float_t REAL(kind=8)
#define MPI_PASTIX_FLOAT MPI_REAL8
使用VS2010我添加了使用/ fpp预处理文件的选项,我没有忘记添加所有包含目录和文件。然而,编译器说:
表示标题行:“警告1警告#5117:错误的#预处理器行”
对于fortran子例程:“错误#6404:此名称没有类型,并且必须具有显式类型。[PASTIX_DATA_PTR_T]”等等其他变量......
我该如何解决这个问题?
答案 0 :(得分:4)
显然,未正确处理该类型的#define
。我认为,一个可能的问题是你在Fortran中包含头文件的方式,因为你是通过 Fortran语句而不是预处理器指令来实现的。因此,可能仅在文件已经过预处理后才包含它。因此,预处理器无法解析.h文件中的#define
选项。
将include()
语句更改为#include
预处理程序指令可能会解决问题。
答案 1 :(得分:3)
这一行
#define pastix_uint_t unsigned INTEGER(kind=4)
将导致大多数Fortran编译器出现问题,因为该语言从未使用此语法或任何其他语法支持无符号整数。一些不正常的实现可能支持它们,但它们绝对不是标准的。