2016-07-22 51 views
0

我必須編寫一個返回逆矩陣的Fortran例程。如果我在Fortran程序中運行下面的代碼,逆矩陣是正確的,但是當我從C++代碼運行子例程時,我的第一個值是錯誤的值。這似乎是數據類型或內存的問題。Fortran子程序在C++程序中調用時發送錯誤的結果

我在做什麼錯?

這裏是子程序:

subroutine get_inverse_matrix(matrix, rows_matrix, cols_matrix, tmpMatrix, rows_tmpMatrix, cols_tmpMatrix) bind(c) 
     use iso_c_binding 
     integer :: m, n, lda, lwork, info, size_m 
     integer(c_int) :: rows_matrix, cols_matrix, rows_tmpMatrix, cols_tmpMatrix 
     real(c_double) :: matrix(rows_matrix, cols_matrix), tmpMatrix(rows_tmpMatrix, cols_tmpMatrix) 
     integer, dimension(rows_matrix) :: ipiv 
     real, dimension(rows_matrix) :: work 
     size_m = rows_matrix 
     m = size_m 
     n = size_m 
     lda = size_m 
     lwork = size_m 
     write(*,*) "Matrix: ", matrix 
     !tmpMatrix = matrix 
     write(*,*) "Temp matrix: ", tmpMatrix 
     ! LU-Faktorisierung (Dreieckszerlegung) der Matrix 
     call sgetrf(m, n, tmpMatrix, lda, ipiv, info) 
     write(*,*) info 
     ! Inverse der LU-faktorisierten Matrix 
     call sgetri(n, tmpMatrix, lda, ipiv, work, lwork, info) 
     write(*,*) info 
     select case(info) 
      case(0) 
      write(*,*) "SUCCESS" 
      case(:-1) 
      write(*,*) "ILLEGAL VALUE" 
      case(1:) 
      write(*,*) "SINGULAR MATRIX" 
     end select 
    end subroutine get_inverse_matrix 

這是在C++代碼的聲明:

extern "C" 
{ 
void get_inverse_matrix(double *matrix, int *rows_matrix, int *cols_matrix, double *tmpMatrix, int *rows_tmpMatrix, int *cols_tmpMatrix);} 

這裏是我的C++程序中調用:

get_inverse_matrix(&lhs[0], &sz, &sz, &res[0], &sz, &sz); 

我的程序僅使用3x3矩陣。如果我通過單位矩陣的結果是這樣的:

5.29981e-315 0 0 
0 1 0 
0 0 1 
+1

您正在傳遞一個聲明爲'c_double'類型的數組來拉包裝例程,這些例程需要單精度,這有時會導致問題。你可以嘗試用'dgetrf'和'dgetri'替換'sgetrf'和'sgetri',這有幫助嗎?在這種情況下,我不會期望fortran能夠工作。注意你可能也應該在C++代碼中顯示聲明。 –

+0

我在C++代碼中添加了聲明。另外,我替換爲你所稱的,但結果是一個只有零的矩陣,不管我嘗試了什麼值。 – fx88

+2

將現代Fortran90 +接口模塊用於LAPACK或至少有一個接口模塊來檢查呼叫錯誤是更好的方法。 –

回答

4

你用那種c_double聲明你數組作爲real類型,但您使用的是期待單精度輸入(例如c_float)LAPACK例程。要解決這個問題,您應該使用dgetrfdgetri替換sgetrfsgetri的調用。

正如Vladimir F在評論中指出的那樣,如果您提供接口,這些問題可能會更容易被捕獲。