2016-03-21 16 views
0

ARPACKからFortran関数dsaupdを呼び出そうとしています。私は、コードがコンパイルされ、最初の「ここ」プリントアウトにしますarpackのためにcからfortran 77を呼び出す

int ido = 0; 
int ncv = 2*numeigs; 
int maxiter = 30; 
double tol = 1e-13; 
double * v = (double *) malloc(numcols * ncv *sizeof(double)); 
int iparam[11] = {1, 0, maxiter, 1, 0, 0, 1, 0, 0, 0, 0}; 
int ipntr[11]; 
double * workd = (double *) malloc(3*numcols*sizeof(double)); 
int lworkl = ncv*(ncv + 8); 
double * workl = (double *) malloc(lworkl*sizeof(double)); 
int arpack_info = 0; 

char bmat = 'I'; 
char which[2] = {'L', 'M'}; 
MPI_Barrier(comm); 
if (mpi_rank == 0) { 
    printf("Here!\n"); 
    dsaupd_(&ido, &bmat, &numcols, which, 
      &numeigs, &tol, vector, 
      &ncv, v, &numcols, 
      iparam, ipntr, workd, 
      workl, &lworkl, &arpack_info); 
    printf("Here!\n"); 
} 

でdsaupd呼び出す前に、私は、以前のプログラムのintとしてNUMCOLSを定義しnetlib-java

extern void dsaupd_(int *ido, char *bmat, int *n, char *which, 
         int *nev, double *tol, double *resid, 
         int *ncv, double *V, int *ldv, 
         int *iparam, int *ipntr, double *workd, 
         double *workl, int *lworkl, int *info); 

からC宣言を使用しましたしかし、それ以降はストールします。どのようなアイデアを私は間違ってやっているか、またはこの呼び出しをデバッグする方法?

+0

1)Cで 'malloc'&friendsの結果をキャストしないでください。2)複合型の初期化子は定数でなければなりません。 – Olaf

+0

私はそれらの両方を試しましたが、まだストールしています。イニシャライザは理にかなっています(ここでmaxiterは定数なので、問題ではありません)が、mallocを正しい型にキャストしないのはなぜですか? – AatG

+0

'maxiter'は決まって定数ではなく、変数です。修飾子が 'const'であっても、それは定数ではありません。 CはC++ではなく、非常に限られた_enum-constants_以外の記号定数はありません。 – Olaf

答えて

1

私のシステムでarpackがコンパイルされていても、間違ってリンクしていたと思います。 arpack-ngに切り替えて問題を修正しました。

関連する問題