Fortran Coder

查看: 15700|回复: 14
打印 上一主题 下一主题

[混编] c++向Fortran的dll传递字符串发生“访问冲突”

[复制链接]

5

帖子

2

主题

0

精华

入门

F 币
35 元
贡献
11 点
跳转到指定楼层
楼主
发表于 2016-11-3 23:09:50 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
根据群主大人的指点(网址:http://bbs.fcode.cn/forum.php?mo ... &page=1#pid6531),我成功地再现了他的代码。但是,当我编写我的代码时,却发生了奇怪的错误,如下:(1)最主要的错误是进入dll的子过程时提示“cpp_main.exe 中的 0x5d7005a9 (vlhm.dll) 处最可能的异常: 0xC0000005: 读取位置 0x00000021 时发生访问冲突
cpp_main.exe 中的 0x5d7005a9 (vlhm.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00000021 时发生访问冲突”。如图:

(2)非常“诡异”的是:群主给的代码,不会提示说要加“@8”,但我的代码,如果和示例代码一样,写成“subroutine vlhm( pfilename , lens ) Bind(C,Name="vlhm")”的话,却提示“无法解析”(可是我并没有改动示例代码啊...)。如图:

闲话少说,下面上代码!
(1)c++主程序的代码:
[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;
}


(2)Fortran的DLL代码:
[Fortran] 纯文本查看 复制代码
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



aaa.png (43.11 KB, 下载次数: 356)

错误(1)

错误(1)

bbb.png (3.11 KB, 下载次数: 371)

错误(2-1)

错误(2-1)

ccc.png (17.37 KB, 下载次数: 352)

错误(2-2)

错误(2-2)
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

5

帖子

2

主题

0

精华

入门

F 币
35 元
贡献
11 点
沙发
 楼主| 发表于 2016-11-4 09:14:38 | 显示全部楼层
大神!!!
我又弱弱地问一下,我用您的代码,但是生成这个dll的时候提示:error #8143: The BIND(C) attribute for this symbol conflicts with a DEC$ ATTRIBUTES ALIAS, DECORATE, STDCALL, C, [NO_]MIXED_STR_LEN_ARG or REFERENCE attribute for this symbol.   [VLHM]。

如果我根据提示,把“stdcall”删掉的话,可以生成,但是lib文件不见了
我用的代码是楼上您提供的:
[Fortran] 纯文本查看 复制代码
subroutine vlhm( pfilename , lens ) Bind(C,Name="vlhm")
!!!subroutine vlhm(pfilename,lens) Bind(C,Name="vlhm@8")
!DEC$ ATTRIBUTES stdcall, DLLEXPORT::vlhm
  use ,Intrinsic::ISO_C_Binding
  implicit none
  type(C_PTR) , value :: pfilename !c++主程序中传递进来的“Inputfile”变量,是C语言的指针
  integer ,value ::lens                                      !传入的字符串长度
  character(len=lens),pointer::filename                     !这是Fortran的字符串
  call c_f_pointer( pfilename , filename )                   !把c语言的指针转换成fortran字符串
  write(*,*)filename
end subroutine

5

帖子

2

主题

0

精华

入门

F 币
35 元
贡献
11 点
板凳
 楼主| 发表于 2016-11-4 09:24:15 | 显示全部楼层

这是删除或保留stdcall的图片
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-7 05:38

Powered by Tencent X3.4

© 2013-2024 Tencent

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