2

私は 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]」など、残りの変数については...

どうすればこれを解決できますか?

4

2 に答える 2

4

どうやら、#define型の が正しく処理されていません。考えられる問題の 1 つは、プリプロセッサ ディレクティブではなくFortran ステートメントを使用してヘッダー ファイルを Fortran にインクルードする方法にあると思います。したがって、ファイルが既に前処理された後にのみ含まれている可能性があります。したがって、.h ファイルのオプションはプリプロセッサによって解決されません。#define

include()文をプリプロセッサ ディレクティブに変更#includeすると、問題が解決する場合があります。

于 2013-01-31T16:31:24.657 に答える
3

この行

#define pastix_uint_t      unsigned INTEGER(kind=4)

言語がこの構文または他の構文を使用して符号なし整数をサポートしたことがないため、ほとんどのFortranコンパイラーに小さな問題が発生します。いくつかの逸脱した実装がそれらをサポートしている可能性がありますが、それらは間違いなく標準ではありません。

于 2013-01-31T16:26:13.777 に答える