Fortran Coder

查看: 72|回复: 5

[混编] QT调用Fortran 传递字符串问题

[复制链接]

5

帖子

2

主题

0

精华

新人

F 币
32 元
贡献
12 点
发表于 2019-6-29 00:51:09 | 显示全部楼层 |阅读模式

   我现在学习用qt调用Fortran的dll文件,向dll传递一个文件名,但是我将他输出来是乱码不知道是为啥,请大神帮忙指出错误。
FORTRAN 代码:
   SUBROUTINE SUB(c)
   !DEC$ ATTRIBUTES DLLEXPORT::SUB
  !DEC$ ATTRIBUTES REFERENCE:: c
       character ::c
   write(*,*)c
END SUBROUTINE SUB


  QT代码:
    QString a;   typedef void(*QTsub)(QString b);    QLibrary dll("DLL2.dll");   
if(dll.load())
   {     
               QTsub sub=(QTsub)dll.resolve("SUB");            
              a=“hello,World”;               
           sub(a);  
}



回复

使用道具 举报

691

帖子

0

主题

0

精华

大师

F 币
665 元
贡献
372 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2019-6-29 10:21:38 | 显示全部楼层
Qt 的 QString 用的是 unicode 编码,需要转换成ANSI编码,才能“直接”被fortran使用

QByteArray ba = a.toLocal8Bit();
sub(ba.data());

5

帖子

2

主题

0

精华

新人

F 币
32 元
贡献
12 点
 楼主| 发表于 2019-7-1 15:11:35 | 显示全部楼层
vvt 发表于 2019-6-29 10:21
Qt 的 QString 用的是 unicode 编码,需要转换成ANSI编码,才能“直接”被fortran使用

QByteArray ba = a. ...

您好,首先很感谢您的解答,但是我按照您的方式修改了qt代码 ,发现输出的还是一堆乱码,是不是因为我Fortran的dll程序有问题啊?

5

帖子

2

主题

0

精华

新人

F 币
32 元
贡献
12 点
 楼主| 发表于 2019-7-1 17:12:14 | 显示全部楼层
感谢大神 已经解决 ,谢谢指导。

1408

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
646 元
贡献
500 点

新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2019-7-1 17:30:15 | 显示全部楼层
问题有2个:

1. typedef void(*QTsub)(QString b); 应该为 typedef void(*QTsub)(char*);
因为 ba.data() 的返回值就是 char* , 只有这种原生的类型才能混编。
你不能把 QString 传进来,fortran不能解析它。

2. Fortran的虚参没有定义长度,这样就算传进来,也只得到第一个字符“h”


实际上,你这种混编方式非常不规范。(换个编译器可能就不行了)
你可以考虑换一个方式:

[Fortran] 纯文本查看 复制代码
SUBROUTINE SUB(pc,n) Bind(C,Name="sub")
   !DEC$ ATTRIBUTES DLLEXPORT::SUB
   use , intrinsic :: ISO_C_Binding
   integer , value :: n
   type(c_ptr) , value :: pc
   character(len=n) , pointer :: c
   call c_f_pointer( pc , c )
   write(*,*) c
END SUBROUTINE SUB


[C++] 纯文本查看 复制代码
#include "main.h"
#include <QLibrary>

extern "C" {
  typedef void(*QTsub)(char*, int);
}
int main() {
  QString a;  
  QLibrary dll("DLL2.dll");
  if (dll.load()) {
    QTsub sub = (QTsub)dll.resolve("sub");
    a = "hello, World";
    QByteArray ba = a.toLocal8Bit();
    sub(ba.data(),ba.size());
  }
}

5

帖子

2

主题

0

精华

新人

F 币
32 元
贡献
12 点
 楼主| 发表于 2019-7-1 19:57:51 | 显示全部楼层
fcode 发表于 2019-7-1 17:30
问题有2个:

1. typedef void(*QTsub)(QString b); 应该为 typedef void(*QTsub)(char*);

是雪球大人嘛?谢谢指导, 我会努力改正规范
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2019-7-17 06:33

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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