Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
互操作性:Fortran到C++;_Fortran_Intel Fortran - Fatal编程技术网

互操作性:Fortran到C++;

互操作性:Fortran到C++;,fortran,intel-fortran,Fortran,Intel Fortran,我想开发一个Fortran静态库,其中包括一个需要花费很长时间才能完成的自定义子例程。 这个静态库也会在我的C++应用程序中静态链接。 我的目标是强>监视< /强>我的C++应用程序中的这个子程序的当前状态实时。< /强> < /p> >,对于“FORTRAN循环”的每一步,我想 >将循环索引< /强>发送到我的C++应用程序。 我是Fortran世界的新手,所以我想这个任务可能是这样的: 我的C++标题:< /强> module my_interfaces use iso_c_b

我想开发一个Fortran静态库,其中包括一个需要花费很长时间才能完成的自定义子例程。 这个静态库也会在我的C++应用程序中静态链接。 <>我的目标是<>强>监视< /强>我的C++应用程序中的这个子程序的当前状态<强>实时。< /强> < /p>

>,<强>对于“FORTRAN循环”的每一步,我想<强> >将循环索引< /强>发送到我的C++应用程序。

我是Fortran世界的新手,所以我想这个任务可能是这样的:

<强>我的C++标题:< /强>

module my_interfaces
    use iso_c_binding
        interface
            subroutine fortran_status(progress_value) bind(C, name = 'fortran_status')
                use, intrinsic :: iso_c_binding
                integer(c_int), intent(out) :: progress_value
            end subroutine fortran_status
        end interface
end module my_interfaces


! My long calc subroutine
subroutine my_long_calc(progress_value) BIND(C, name = 'my_long_calc')
    use, intrinsic :: ISO_C_BINDING
    use my_interfaces
    implicit none

    EXTERNAL fortran_status

    integer (C_INT), INTENT(INOUT) :: progress_value
    integer (C_INT) :: count


    do count = 0, 5    
        progress_value = progress_value + 1

        ! Send 'progress_value' to a C++ function:
        call fortran_status(progress_value)

        ! Wait 1 second:
        call sleep(1)
    end do

end subroutine my_long_calc
error #6406: Conflicting attributes or multiple declaration of name.   [FORTRAN_STATUS]       C:\Users\lamar\Desktop\Lib1_interface\Lib1.f90    18 
module my_interfaces
  use iso_c_binding
  interface
    subroutine fortran_status(progress_value) bind(C, name = 'fortran_status')
      use, intrinsic :: iso_c_binding
      integer(c_int), intent(out) :: progress_value
    end subroutine fortran_status
  end interface
end module my_interfaces


! My long calc subroutine
subroutine my_long_calc() BIND(C, name = 'my_long_calc')
  use, intrinsic :: ISO_C_BINDING
  use my_interfaces
  implicit none

  integer (C_INT) :: progress_value
  integer (C_INT) :: count

  progress_value = 0

  do count = 0, 5
    progress_value = count

    ! Send 'progress_value' to a C++ function:
    call fortran_status(progress_value)

    ! Wait 1 second:
    call sleep(1)
  end do
end subroutine my_long_calc
#include <iostream>

extern "C" {
    void my_long_calc(void);
    void fortran_status(int* value);
}

void fortran_status(int* value)
{
    std::cout << "Fortran current status = " << *value << std::endl;
}

int main (void)
{
    std::cout << "Monitoring Fortran subroutine..." << std::endl;

    my_long_calc();

    return 0;
}
extern“C”void fortran_状态(int*值)

我的Fortran-90文件:

module my_interfaces
    use iso_c_binding
        interface
            subroutine fortran_status(progress_value) bind(C, name = 'fortran_status')
                use, intrinsic :: iso_c_binding
                integer(c_int), intent(out) :: progress_value
            end subroutine fortran_status
        end interface
end module my_interfaces


! My long calc subroutine
subroutine my_long_calc(progress_value) BIND(C, name = 'my_long_calc')
    use, intrinsic :: ISO_C_BINDING
    use my_interfaces
    implicit none

    EXTERNAL fortran_status

    integer (C_INT), INTENT(INOUT) :: progress_value
    integer (C_INT) :: count


    do count = 0, 5    
        progress_value = progress_value + 1

        ! Send 'progress_value' to a C++ function:
        call fortran_status(progress_value)

        ! Wait 1 second:
        call sleep(1)
    end do

end subroutine my_long_calc
error #6406: Conflicting attributes or multiple declaration of name.   [FORTRAN_STATUS]       C:\Users\lamar\Desktop\Lib1_interface\Lib1.f90    18 
module my_interfaces
  use iso_c_binding
  interface
    subroutine fortran_status(progress_value) bind(C, name = 'fortran_status')
      use, intrinsic :: iso_c_binding
      integer(c_int), intent(out) :: progress_value
    end subroutine fortran_status
  end interface
end module my_interfaces


! My long calc subroutine
subroutine my_long_calc() BIND(C, name = 'my_long_calc')
  use, intrinsic :: ISO_C_BINDING
  use my_interfaces
  implicit none

  integer (C_INT) :: progress_value
  integer (C_INT) :: count

  progress_value = 0

  do count = 0, 5
    progress_value = count

    ! Send 'progress_value' to a C++ function:
    call fortran_status(progress_value)

    ! Wait 1 second:
    call sleep(1)
  end do
end subroutine my_long_calc
#include <iostream>

extern "C" {
    void my_long_calc(void);
    void fortran_status(int* value);
}

void fortran_status(int* value)
{
    std::cout << "Fortran current status = " << *value << std::endl;
}

int main (void)
{
    std::cout << "Monitoring Fortran subroutine..." << std::endl;

    my_long_calc();

    return 0;
}
这段Fortran代码给了我一个编译时错误:

module my_interfaces
    use iso_c_binding
        interface
            subroutine fortran_status(progress_value) bind(C, name = 'fortran_status')
                use, intrinsic :: iso_c_binding
                integer(c_int), intent(out) :: progress_value
            end subroutine fortran_status
        end interface
end module my_interfaces


! My long calc subroutine
subroutine my_long_calc(progress_value) BIND(C, name = 'my_long_calc')
    use, intrinsic :: ISO_C_BINDING
    use my_interfaces
    implicit none

    EXTERNAL fortran_status

    integer (C_INT), INTENT(INOUT) :: progress_value
    integer (C_INT) :: count


    do count = 0, 5    
        progress_value = progress_value + 1

        ! Send 'progress_value' to a C++ function:
        call fortran_status(progress_value)

        ! Wait 1 second:
        call sleep(1)
    end do

end subroutine my_long_calc
error #6406: Conflicting attributes or multiple declaration of name.   [FORTRAN_STATUS]       C:\Users\lamar\Desktop\Lib1_interface\Lib1.f90    18 
module my_interfaces
  use iso_c_binding
  interface
    subroutine fortran_status(progress_value) bind(C, name = 'fortran_status')
      use, intrinsic :: iso_c_binding
      integer(c_int), intent(out) :: progress_value
    end subroutine fortran_status
  end interface
end module my_interfaces


! My long calc subroutine
subroutine my_long_calc() BIND(C, name = 'my_long_calc')
  use, intrinsic :: ISO_C_BINDING
  use my_interfaces
  implicit none

  integer (C_INT) :: progress_value
  integer (C_INT) :: count

  progress_value = 0

  do count = 0, 5
    progress_value = count

    ! Send 'progress_value' to a C++ function:
    call fortran_status(progress_value)

    ! Wait 1 second:
    call sleep(1)
  end do
end subroutine my_long_calc
#include <iostream>

extern "C" {
    void my_long_calc(void);
    void fortran_status(int* value);
}

void fortran_status(int* value)
{
    std::cout << "Fortran current status = " << *value << std::endl;
}

int main (void)
{
    std::cout << "Monitoring Fortran subroutine..." << std::endl;

    my_long_calc();

    return 0;
}
我正在使用Microsoft Visual Studio 2019和英特尔Visual Fortran(Windows 10 x64)

我如何监控该子例程的状态?或者在我的C++应用程序中获得FORTRAN循环索引?< /强> < /P> 更新1: 我删除了
外部fortran_状态
,现在我的fortran代码的编译时没有错误

现在,我想把这个静态库(x86)与我的C++代码链接:

#include <iostream>

extern "C" {
  void my_long_calc(void);
  void fortran_status(int* value);
}

void fortran_status(int* value)
{
  std::cout << "Fortran current status = " << *value << std::endl;
}

int main (void)
{
  std::cout << "Monitoring Fortran subroutine..." << std::endl;

  my_long_calc();

  return 0;
}
更新2 现在,这段经过修改的Fortran代码可以编译,并且只有在使用MingW g++(x86)时才能正常工作。

Fortran代码:

module my_interfaces
    use iso_c_binding
        interface
            subroutine fortran_status(progress_value) bind(C, name = 'fortran_status')
                use, intrinsic :: iso_c_binding
                integer(c_int), intent(out) :: progress_value
            end subroutine fortran_status
        end interface
end module my_interfaces


! My long calc subroutine
subroutine my_long_calc(progress_value) BIND(C, name = 'my_long_calc')
    use, intrinsic :: ISO_C_BINDING
    use my_interfaces
    implicit none

    EXTERNAL fortran_status

    integer (C_INT), INTENT(INOUT) :: progress_value
    integer (C_INT) :: count


    do count = 0, 5    
        progress_value = progress_value + 1

        ! Send 'progress_value' to a C++ function:
        call fortran_status(progress_value)

        ! Wait 1 second:
        call sleep(1)
    end do

end subroutine my_long_calc
error #6406: Conflicting attributes or multiple declaration of name.   [FORTRAN_STATUS]       C:\Users\lamar\Desktop\Lib1_interface\Lib1.f90    18 
module my_interfaces
  use iso_c_binding
  interface
    subroutine fortran_status(progress_value) bind(C, name = 'fortran_status')
      use, intrinsic :: iso_c_binding
      integer(c_int), intent(out) :: progress_value
    end subroutine fortran_status
  end interface
end module my_interfaces


! My long calc subroutine
subroutine my_long_calc() BIND(C, name = 'my_long_calc')
  use, intrinsic :: ISO_C_BINDING
  use my_interfaces
  implicit none

  integer (C_INT) :: progress_value
  integer (C_INT) :: count

  progress_value = 0

  do count = 0, 5
    progress_value = count

    ! Send 'progress_value' to a C++ function:
    call fortran_status(progress_value)

    ! Wait 1 second:
    call sleep(1)
  end do
end subroutine my_long_calc
#include <iostream>

extern "C" {
    void my_long_calc(void);
    void fortran_status(int* value);
}

void fortran_status(int* value)
{
    std::cout << "Fortran current status = " << *value << std::endl;
}

int main (void)
{
    std::cout << "Monitoring Fortran subroutine..." << std::endl;

    my_long_calc();

    return 0;
}
C++代码:

module my_interfaces
    use iso_c_binding
        interface
            subroutine fortran_status(progress_value) bind(C, name = 'fortran_status')
                use, intrinsic :: iso_c_binding
                integer(c_int), intent(out) :: progress_value
            end subroutine fortran_status
        end interface
end module my_interfaces


! My long calc subroutine
subroutine my_long_calc(progress_value) BIND(C, name = 'my_long_calc')
    use, intrinsic :: ISO_C_BINDING
    use my_interfaces
    implicit none

    EXTERNAL fortran_status

    integer (C_INT), INTENT(INOUT) :: progress_value
    integer (C_INT) :: count


    do count = 0, 5    
        progress_value = progress_value + 1

        ! Send 'progress_value' to a C++ function:
        call fortran_status(progress_value)

        ! Wait 1 second:
        call sleep(1)
    end do

end subroutine my_long_calc
error #6406: Conflicting attributes or multiple declaration of name.   [FORTRAN_STATUS]       C:\Users\lamar\Desktop\Lib1_interface\Lib1.f90    18 
module my_interfaces
  use iso_c_binding
  interface
    subroutine fortran_status(progress_value) bind(C, name = 'fortran_status')
      use, intrinsic :: iso_c_binding
      integer(c_int), intent(out) :: progress_value
    end subroutine fortran_status
  end interface
end module my_interfaces


! My long calc subroutine
subroutine my_long_calc() BIND(C, name = 'my_long_calc')
  use, intrinsic :: ISO_C_BINDING
  use my_interfaces
  implicit none

  integer (C_INT) :: progress_value
  integer (C_INT) :: count

  progress_value = 0

  do count = 0, 5
    progress_value = count

    ! Send 'progress_value' to a C++ function:
    call fortran_status(progress_value)

    ! Wait 1 second:
    call sleep(1)
  end do
end subroutine my_long_calc
#include <iostream>

extern "C" {
    void my_long_calc(void);
    void fortran_status(int* value);
}

void fortran_status(int* value)
{
    std::cout << "Fortran current status = " << *value << std::endl;
}

int main (void)
{
    std::cout << "Monitoring Fortran subroutine..." << std::endl;

    my_long_calc();

    return 0;
}
#包括
外部“C”{
作废我的长期计算(作废);
无效fortran_状态(int*值);
}
void fortran_状态(int*值)
{
STD::CUT< P>你的“更新2”代码完全完美,并与英特尔Visual Fortran和微软Visual C++一起工作。

我不建议将英特尔Visual Fortran编译对象/库与Windows上的g++混合使用。如果您符合相当宽松的许可条款,您可以免费获得Microsoft Visual Studio Community Edition。如果您坚持使用g++,请将其与gfortran混合使用。

您不应该使用
外部Fortran_状态
,因为您已经授予了de在模块中对接口进行了定义。因此我们可以进一步解释,为什么您认为
外部
语句是必要的?谢谢@francescalus!您是对的!现在我的fortran代码在编译时没有出现错误。谢谢!完整的答案和一些细节在这里:不幸的是,链接死了。这里也有链接,但我t也没有任何结果。@VladimirF你在寻找哪个链接?到答案中链接的讨论帖子。它现在不会在任何地方出现。我找到了新的链接并更新了上面的帖子。