我已包裹sqlite3_open,sqlite3_close,并从为了SQLite的(3.16.2版)C-API sqlite3_exec例程将它们从使用ISO_C_BINDING模块Fortran 2003的程序中调用。我使用Intel Fortran 17编译器(ifort),在Windows上使用MSVC 14,在Linux上使用gcc。如何从sqlite3_open存储数据库连接句柄?
我的目标是打开的SQLite数据库和存储的指针数据库连接手柄,这样,当Fortran程序遍历其计算,我可以用它来存储/检索结果。主程序的伪代码看起来像这样:
program main
use, intrinsic :: iso_c_binding
use sqlite_wrapper_module
implicit none
! QUESTION: SHOULD DB_HANDLE BE TYPE(C_PTR) OR A STRUCT OF SOME KIND?
type(C_PTR) :: db_handle
character(len=:), allocatable :: db_name
db_name = "test.db"//C_NULL_CHAR
call sqlite3_open_WRAPPER(db_name, db_handle) ! wraps sqlite3_open
do i=1,n
...compute stuff...
call sqlite3_exec_WRAPPER(db_handle, sql_stmt) ! wraps sqlite3_exec
...compute stuff...
enddo
call sqlite3_close_WRAPPER(db_handle) ! wraps sqlite3_close
end program main
我已经在一个单独的模块中定义了封装器C例程的显式接口。例如:
module sqlite_wrapper_module
use, intrisic :: iso_c_binding
implicit none
interface
subroutine sqlite3_open_WRAPPER(db_name, db_handle) bind(C)
import
character(kind=C_CHAR), dimension(*) :: db_name
type(C_PTR), value :: db_handle
end subroutine sqlite3_open_wrapper
end interface
end module sqlite_wrapper_module
我不知道我理解的official docs,但他们似乎声明* db是代表数据库连接手柄,这是一个“不透明结构”定义为typedef struct sqlite3 sqlite3;
的指针。我不知道这到底意味着什么(C编程不是我的强项)。所以我尝试从Fortran设置C_PTR如下:
int sqlite3_open_WRAPPER(char *filename, sqlite3 *pdb) {
sqlite3 *db;
int rc=sqlite3_open(filename, &db);
pdb=db; // <---------------------------------This
...check rc...
return 0;
}
起初,这似乎工作。但是,鼠标指针返回NULL一次传回Fortran程序,而不能在sqlite3_exec或sqlite3_close使用。我应该在Fortran程序中定义某种类型的struct
作为数据库连接结构,并将其传递给C例程?
使用标签[tag:fortran]获得更多关注。添加一个版本标签来区分特定的版本,但这不适用于此,您的问题也适用于以后的版本。 –