fcode 发表于 2021-8-20 19:29 之前百度了一个答案说是新版中sqlite3_step已经包含了sqlite3_reset,所以我给去掉了…… 现在加上就好了,非常感谢! 再次感谢二位这段时间不厌其烦的帮助! |
function sqlite3_reset(stmt) bind(c) import type(c_ptr), value :: stmt integer(c_int) sqlite3_reset end function sqlite3_reset istat = sqlite3_step(stmt) write(*,"(A,I0,A,I0)") "第",i,"次sqlite3_step返回",istat istat = sqlite3_reset(stmt) |
sqlite3_bind_text 的时候,并没有写入,只是存入地址。 等到 sqlite3_step 的时候,才会真正写入。 因为你都是用的 s_data 这个变量,所以地址相同。 最后,所有的值,都是最后一次的值 |
sss = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"c istat = sqlite3_bind_text(stmt, 1, sss, 32, c_null_ptr); 这样就可以了。此处sss只能是引用,不能是表达式。 因为给 C 语言的是一个指针,而表达式结果是临时存放的,一旦整个语句结束,表达式的结果就清空了。 你试试,这样都不行: istat = sqlite3_bind_text(stmt, 1, (sss), 32, c_null_ptr); 因为 (sss) 也是一个表达式。 |
本帖最后由 andy8496 于 2021-8-18 10:20 编辑 布衣龙共 发表于 2021-8-16 16:14 非常不好意思,又遇到一个问题。 在7#楼附件工程DB_Test/FortranCallC/Source Files/FortranCallC.f90中,生成数据文件的部分: [Fortran] 纯文本查看 复制代码 int get_table(char ***Results ); 如果在sqlite3_bind_text中像上文那样直接用字符串常量就没问题: [Fortran] 纯文本查看 复制代码 interface function get_table(Results) bind(c) use iso_c_binding, only: c_int, c_char character(kind=c_char),dimension(*)::Results integer(c_int):: get_table end function end interface 但是改成变量写进去的就是乱码,读出来的也是乱码了 [Fortran] 纯文本查看 复制代码 character(8) :: Results(3,10) i = get_table(Results) 能想到的原因有两个: ①字符串声明的有问题,或者类型不合适 ②可能与编码有关 做了一些尝试,问题依旧。无奈再次求助! |
布衣龙共 发表于 2021-8-16 17:44 Perfect!再次感谢!!! |
可以,没关系的。 Fortran 的指针不需要释放,C那边你找找,可能有别的函数来释放。 |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-11-23 11:48