Fortran Coder

查看: 6037|回复: 4
打印 上一主题 下一主题

[混编] fortran做成DLL后的字符串问题

[复制链接]

20

帖子

4

主题

0

精华

入门

F 币
97 元
贡献
48 点
跳转到指定楼层
楼主
发表于 2016-12-9 21:58:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 晒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, 下载次数: 233)

“直接运行”的结果

“直接运行”的结果

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

图b

图b

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

c.jpg

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

d.jpg

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

图f

图f

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

g.jpg

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

h.jpg
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

20

帖子

4

主题

0

精华

入门

F 币
97 元
贡献
48 点
沙发
 楼主| 发表于 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++:
[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, 下载次数: 245)

图1

图1

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

图2.jpg

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

图3

图3

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

图4.jpg

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1642 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

板凳
发表于 2016-12-10 07:39:46 | 只看该作者
这两天略忙。

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

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

地板
发表于 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,二者缺一不可

20

帖子

4

主题

0

精华

入门

F 币
97 元
贡献
48 点
5#
 楼主| 发表于 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 ...

谢谢你 我会好好学C的,不然形成不了体系
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-26 22:24

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表