pasuka 发表于 2016-11-21 09:10 哈哈,我属于非专业程序猿,算是半吊子,见笑了 |
zhuhuanlai 发表于 2016-11-19 12:10 可惜了,看来ls对于程序编译还是一知半解。。sigh |
pasuka 发表于 2016-11-18 08:47 感谢您的回复,我想用到的是FORTRAN输出的DLL文件。 |
给点干货吧 Fortran代码 [Fortran] 纯文本查看 复制代码 #include "stdafx.h" #include <stdio.h> #include <string.h> extern "C" {void _stdcall vlhm(char *,int); } //extern "C" {void vlhm(char *,int); } int _tmain(int argc, _TCHAR* argv[]) { char *inputfile= "C:\\Users\\www\\Desktop\\31005700.tem"; //char *inputfile; //char str[] = "C:\\Users\\www\\Desktop\\\\31005700.tem"; //inputfile=&str[0]; vlhm(inputfile,strlen(inputfile)); return 0; } c++代码 [C++] 纯文本查看 复制代码 subroutine vlhm( pfilename , lens ) Bind(C,Name="vlhm") !!!subroutine vlhm(pfilename,lens) Bind(C,Name="vlhm@8") !DEC$ ATTRIBUTES DLLEXPORT::vlhm use ,Intrinsic::ISO_C_Binding implicit none type(C_PTR) , value :: pfilename !c++主程序中传递进来的“Inputfile”变量,是C语言的指针 integer::lens !传入的字符串长度 character(len=lens),pointer::filename !这是Fortran的字符串 call c_f_pointer( pfilename , filename ) !把c语言的指针转换成fortran字符串 write(*,*)filename end subroutine 编译命令 [Bash shell] 纯文本查看 复制代码 module mixcompile use iso_c_binding implicit none contains subroutine cpp_print(cpp_char, n) bind(c, name="f90print") use iso_c_binding implicit none type(c_ptr), value:: cpp_char integer(c_int), value:: n character(len=n), pointer:: f_string call c_f_pointer(cpp_char, f_string) write(*, '("Length of string:", 1x, I4)')n write(*, *)f_string end subroutine end module |
本帖最后由 zhuhuanlai 于 2016-11-17 21:15 编辑 您好,请问您在再现群主的代码时,出现过图一问题吗? 我把int _tmain(int argc, _TCHAR* argv[]) 改成 int main(int argc, _TCHAR* argv[]) 出现了同样的错误 我改成 int main() 去掉里面的参数后又出现图二错误: 如果您方便,请帮忙分享一下您的再现方法,非常感谢? |
221444jpbmq0lw0m0rvio9.jpg (292.27 KB, 下载次数: 438)
图一
X{GX@96334{Q{~W2)ZIV459.jpg (228.75 KB, 下载次数: 438)
图二
fcode 发表于 2016-11-15 23:03 感谢您在这么晚的时间还给出了如此详尽的指点! 拜读了您的指点后,豁然开朗,Fortran有您更精彩! |
1. 你不能全部照抄别人的例子,例如这个例子,是因为提问者的“甲方”要求,必须使用 stdcall。 2. 而 ISO_C_Binding 只能用“规范的语言”写 c 的调用协定,而不能写 stdcall 调用协定。 3. 因此,这个例子的提问者没有办法,只能使用 ATTRIBUTES 来实现 stdcall 4. 如果你只是要和 C 进行混编,而没有“必须使用 stdcall”的要求。那么 Bind( C 就可以实现 5. 我对IVF各个版本具体支持什么扩展特性并不十分清楚。毕竟我用过的也就那么一两个版本,而不会每个版本都用。 6. 去掉 Bind(C 的话,会有两个影响: a. 不能默认 c调用协定,而使用 IVF协定(当然你可以用 ATTRIBUTES 更改协定,只不过低版本的IVF不允许 Bind C 和 ATTRIBUTES并存,因为两者冲突) b. 不能默认 c的“符号修饰”(比如 name(x) 被修饰为 _name@4 或者 _name),相当于 Alias。 除了上面两个差别,Bind( C )没有其他作用。关于参数传递约定,数组/字符串传递,请遵循 ISO_C_Binding 约定。 其实混编就那么点东西 Bind(C 是规范的,用来起到默认 C 协定,及默认 C 符号修饰的目的。 而 ATTRIBUTES 和 ALIAS 是扩展语法。作用其实与 Bind C 一样。 区别,仅仅是规范和不规范而已。 |
本帖最后由 zhuhuanlai 于 2016-11-15 12:43 编辑 去掉 Bind(C ,Name="vlhm") 然后 ATTRIBUTES 里面写 stdcall 和 alias. stdcall 和 alias.是IVF扩展的写法,相当于堆栈清理和命名约定不再通过 ISO_C_Binding。 但是如果去掉Bind(C ,Name="vlhm"),只使用use ,Intrinsic::ISO_C_Binding,在参数传递约定和数组/字符串传递约定还有效吗? 另外,我是2013VS+2013IVF,需要哪个版本的编译器才支持呢? |
看 5 楼 |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2025-4-16 01:42