晒sunstar 发表于 2016-12-9 21:58:06

fortran做成DLL后的字符串问题

本帖最后由 晒sunstar 于 2016-12-9 21:58 编辑

C++向Fortran中传递字符串,已经成功,但是出了些问题。“直接运行”能够成功,“调试状态”就会出错。详述如下:
一、代码:
(1)C++代码:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>

extern "C" {void _stdcall   main(char *,int); }

int _tmain(int argc, _TCHAR* argv[])
{
char *inputfile= "Passing...Good Luck!";               
main(inputfile,strlen(inputfile));
return 0;
}
(2)Fortran代码:
subroutine main( pfilename , lens )
!DEC$ ATTRIBUTES stdcall,ALIAS:"_main@8",DLLEXPORT::main
use ,Intrinsic::ISO_C_Binding

implicit none
type(C_PTR) , value :: pfilename
integer,value::lens                                    
character(len=lens),pointer::filename_a            
character(len=512)::filename_b               
character(len=512)::path_one,path_two

call c_f_pointer( pfilename , filename_a )               

filename_b=filename_a
write(*,*)"传进来的字符串是:",trim(filename_b)               
path_one="Hello World!"
write(*,*)"Path_one是:",trim(path_one)
path_two=path_one
write(*,*)"Path_two是:",trim(path_two)
end subroutine


二、问题描述
(1)直接运行:
如图a,程序能够运行。
(2)调试模式:
1)如图b,在c++的这一句会第一次进入“strlen.asm”,按“继续”能继续(如图c);
2)进入Fortran的DLL后,前几句能正常执行,但到“path_two=path_one”一句时进入memcpy.asm,如图d和e。
3)一直按F11,会进入“无可用源”,如图f。
4)再一直按F11,进入反汇编;再按“继续”就退出了。如图g和h。

晒sunstar 发表于 2016-12-9 22:48:44

我根据http://bbs.fcode.cn/forum.php?mod=viewthread&tid=1117&highlight=dll,用3楼的“ISO_C_Binding”的方法,C++的主工程连接的时候出现图1情况。然后“调试”的时候这个断点直接跳过了,如图2。
进入Fortran之后,到这一句就断了,而且我看前面的变量也没有正确赋值,如图3。
再点“继续”就是图4了。
我现在的代码如下:
C++:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>

extern "C" {void   main(char *,int); }

int _tmain(int argc, _TCHAR* argv[])
{
char *inputfile= "Passing...Good Luck!";               
main(inputfile,strlen(inputfile));
return 0;
}


Fortran:
subroutine main( pfilename , lens )Bind(C,Name="main")
!DEC$ ATTRIBUTES DLLEXPORT ::main
use ,Intrinsic::ISO_C_Binding

implicit none
type(C_PTR) , value :: pfilename
integer,value::lens                                    
character(len=lens),pointer::filename_a            
character(len=512)::filename_b               
character(len=512)::path_one,path_two

call c_f_pointer( pfilename , filename_a )               

filename_b=filename_a
write(*,*)"传进来的字符串是:",trim(filename_b)               
path_one="Hello World!"
write(*,*)"Path_one是:",trim(path_one)
path_two=path_one
write(*,*)"Path_two是:",trim(path_two)
end subroutine

fcode 发表于 2016-12-10 07:39:46

这两天略忙。

如果今晚你还没有解决,可以找我 QQ 419322223 私聊。

pasuka 发表于 2016-12-12 13:15:18

本帖最后由 pasuka 于 2016-12-12 13:19 编辑

请先搞明白main函数在C和C++中的地位
Main function - cppreference.com
http://en.cppreference.com/w/cpp/language/main_function
熟练使用Fortran的iso c binding进行混合编程的前提是同时掌握C和Fortran,二者缺一不可

晒sunstar 发表于 2017-1-13 21:26:35

pasuka 发表于 2016-12-12 13:15
请先搞明白main函数在C和C++中的地位
Main function - cppreference.com
http://en.cppreference.com/w/cpp ...

谢谢你:-handshake 我会好好学C的,不然形成不了体系
页: [1]
查看完整版本: fortran做成DLL后的字符串问题