Fortran Coder

标题: QT调用Fortran 传递字符串问题 [打印本页]

作者: 紫雪封尘    时间: 2019-6-29 00:51
标题: QT调用Fortran 传递字符串问题

   我现在学习用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);  
}




作者: vvt    时间: 2019-6-29 10:21
Qt 的 QString 用的是 unicode 编码,需要转换成ANSI编码,才能“直接”被fortran使用

QByteArray ba = a.toLocal8Bit();
sub(ba.data());
作者: 紫雪封尘    时间: 2019-7-1 15:11
vvt 发表于 2019-6-29 10:21
Qt 的 QString 用的是 unicode 编码,需要转换成ANSI编码,才能“直接”被fortran使用

QByteArray ba = a. ...

您好,首先很感谢您的解答,但是我按照您的方式修改了qt代码 ,发现输出的还是一堆乱码,是不是因为我Fortran的dll程序有问题啊?
作者: 紫雪封尘    时间: 2019-7-1 17:12
感谢大神 已经解决 ,谢谢指导。
作者: fcode    时间: 2019-7-1 17:30
问题有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());
  }
}

作者: 紫雪封尘    时间: 2019-7-1 19:57
fcode 发表于 2019-7-1 17:30
问题有2个:

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

是雪球大人嘛?谢谢指导, 我会努力改正规范




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