Fortran Coder

标题: fortran做成DLL后的字符串问题 [打印本页]

作者: 晒sunstar    时间: 2016-12-9 21:58
标题: fortran做成DLL后的字符串问题
本帖最后由 晒sunstar 于 2016-12-9 21:58 编辑

C++向Fortran中传递字符串,已经成功,但是出了些问题。“直接运行”能够成功,“调试状态”就会出错。详述如下:
一、代码:
(1)C++代码:
[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代码:
[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。

a.jpg (12.61 KB, 下载次数: 227)

“直接运行”的结果

“直接运行”的结果

b.jpg (8.73 KB, 下载次数: 222)

图b

图b

c.jpg (20.64 KB, 下载次数: 221)

c.jpg

d.jpg (26.07 KB, 下载次数: 232)

d.jpg

f.jpg (19.95 KB, 下载次数: 223)

图f

图f

g.jpg (30.28 KB, 下载次数: 212)

g.jpg

h.jpg (53.76 KB, 下载次数: 221)

h.jpg

作者: 晒sunstar    时间: 2016-12-9 22:48
我根据http://bbs.fcode.cn/forum.php?mod=viewthread&tid=1117&highlight=dll,用3楼的“ISO_C_Binding”的方法,C++的主工程连接的时候出现图1情况。然后“调试”的时候这个断点直接跳过了,如图2。
进入Fortran之后,到这一句就断了,而且我看前面的变量也没有正确赋值,如图3。
再点“继续”就是图4了。
我现在的代码如下:
C++:
[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:
[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  

1.jpg (23.46 KB, 下载次数: 236)

图1

图1

图2.jpg (9.92 KB, 下载次数: 219)

图2.jpg

图3.jpg (38.05 KB, 下载次数: 237)

图3

图3

图4.jpg (50.34 KB, 下载次数: 231)

图4.jpg

作者: fcode    时间: 2016-12-10 07:39
这两天略忙。

如果今晚你还没有解决,可以找我 QQ 419322223 私聊。
作者: pasuka    时间: 2016-12-12 13:15
本帖最后由 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
pasuka 发表于 2016-12-12 13:15
请先搞明白main函数在C和C++中的地位
Main function - cppreference.com
http://en.cppreference.com/w/cpp ...

谢谢你 我会好好学C的,不然形成不了体系




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2