相关疑难解决方法(0)

从C调用FORTRAN子例程

我试图从C调用FORTRAN函数

我的问题是:

  1. 如果fortRoutine是我的fortran子程序的名称,那么我从C中调用它fortRoutine_.如果fortRoutine只包含一个字符数组参数,那么我可以像这样传递:

    fortRoutine_("I am in fortran");
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在调用FORTRAN子例程时,何时应该使用pass by值和何时通过引用传递?

由于我是C的新手,我对此并不了解.如果可能的话,请提供一些很好的教程链接.

c fortran fortran-iso-c-binding

13
推荐指数
2
解决办法
9453
查看次数

将char数组从c ++传递给fortran

我无法将char数组从c ++传递给fortran(f90).

这是我的c ++文件'cmain.cxx':

#include <iostream>

using namespace std;

extern "C" int ftest_( char (*string)[4] );

int main() {
    char string[2][4];

    strcpy(string[0],"abc");
    strcpy(string[1],"xyz");

    cout << "c++: string[0] = '" << string[0] << "'" << endl;
    cout << "c++: string[1] = '" << string[1] << "'" << endl;

    ftest_(string);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的fortran文件'ftest.f90':

SUBROUTINE FTEST(string)

CHARACTER*3 string(2)
CHARACTER*3 expected(2)
data expected(1)/'abc'/
data expected(2)/'xyz'/

DO i=1,2
    WRITE(6,10) i,string(i)
10  FORMAT("fortran: string(",i1,") = '", a, "'" )

    IF(string(i).eq.expected(i)) THEN
        WRITE(6,20) string(i),expected(i)
20      FORMAT("'",a,"' …
Run Code Online (Sandbox Code Playgroud)

c++ arrays fortran

6
推荐指数
2
解决办法
6495
查看次数

如何将C++中的2D数组传递给Fortran子例程?

我正在编写一个小型的C++程序,它将一个二维数组(复数)传递给一个Fortran子程序,然后将它接收回来填充值.我写了一个通过并接收一维数组的版本,这很有效.2-D版本不起作用(我的真正目标是编写具有大尺寸的4-D版本 - 因此必须动态分配这些数组).

我将发布我的工作代码和非工作代码,但首先请注意我被迫使用结构(简单的,只包含两个双精度),因为Fortran似乎以与其自身的原始复数完全相同的方式解释它们.这就是我的1-D版本有效的原因.出于同样的原因,我不认为这是一个"复杂数字"的问题.

这是我的工作代码.将一维复数数组传递给Fortran子程序:

Fortran子程序:

subroutine carray(A)
complex*16 A(2)

A(1) = cmplx(3,7)
A(2) = cmplx(9,5)

return
end
Run Code Online (Sandbox Code Playgroud)

C++代码:

include <iostream>
include <complex>
using namespace std;

struct cpx{double r, i;};

extern"C"
{
   void carray_(struct cpx* A);
}

int main()
{
   struct cpx* A;
   A = new struct cpx [2];

   carray_(A);

   complex<double>* P;
   P = new complex<double> [2];

   for(x = 0; x < 2; x++)
   {
      real(P[x] = A[x].r;
      imag(P[x] = A[x].i;
   }

   cout << real(P[0]) << "\t" << imag(P[0]) << …
Run Code Online (Sandbox Code Playgroud)

c++ fortran

5
推荐指数
2
解决办法
6972
查看次数

将一个C字符串数组传递给Fortran(iso_c_binding)

如何将C strings(char* cstrings[])数组传递给Fortran子例程?

问题使用iso_c_binding的fortran-C桥接器中的字符串数组肯定是相关的,但答案似乎不正确,甚至不能用GNU Fortran编译.

我目前正在为Fortran代码开发一个C接口,我预计iso_c_binding(我之前使用过的)会让这件事变得轻而易举.到目前为止C字符串数组没有运气......

Fortran子例程应该将一个字符串数组作为参数.在普通的Fortran中,我会写如下内容:

subroutine print_fstring_array(fstring)

  implicit none

  character(len=*), dimension(:), intent(in) :: fstring
  integer                                    :: i

  do i = 1, size(fstring)
    write(*,*) trim(fstring(i))
  end do

end subroutine print_fstring_array
Run Code Online (Sandbox Code Playgroud)

将单个C字符串传递给Fortran的一种方法是作为C指针(c_ptr)(我知道,我也可以使用一个数组character(kind=c_char))

subroutine print_cstring(cstring) bind(C)

  use iso_c_binding, only: c_ptr, c_f_pointer, c_loc, c_null_char
  implicit none

  type(c_ptr), target, intent(in) :: cstring
  character(len=1024), pointer    :: fstring
  integer                         :: slen

  call c_f_pointer(c_loc(cstring), fstring)
  slen = index(fstring, c_null_char) - 1
  write(*,*) fstring(1:slen)

end subroutine print_cstring …
Run Code Online (Sandbox Code Playgroud)

c string fortran fortran-iso-c-binding

5
推荐指数
1
解决办法
2195
查看次数

Fortran从C接受字符串(?)

我觉得这应该是一个简单的问题,但我无法让它发挥作用.我有一些Fortran代码,它接受如下输入:

      SUBROUTINE TRACE(X,Y,NAME,XX,YY)
      EXTERNAL NAME
      CALL NAME(X,Y,XX,YY)
Run Code Online (Sandbox Code Playgroud)

我试图从以下形式传递C++的名称:

float x,y,xx,yy;
char * name="IGRF";
trace_(&x,&y,name,&xx,&yy);
Run Code Online (Sandbox Code Playgroud)

它编译,但当我尝试调用NAME子例程时,我总是得到段错误.在文件中定义了一个名为IGRF的子程序,我可以直接从C++调用IGRF子程序,但需要这个TRACE例程.在gdb中运行时,它表示NAME变量作为指向void的指针.

我已经尝试传递NAME,&NAME和NAME [0],一个字符名称[4],它被剥离了\ 0以完全符合名称,并且它们都返回显示相同的空指针.有谁知道如何从C++中将函数名称转换为Fortran中的EXTERNAL变量?

谢谢

c++ fortran

4
推荐指数
1
解决办法
3070
查看次数

标签 统计

fortran ×5

c++ ×3

c ×2

fortran-iso-c-binding ×2

arrays ×1

string ×1