小编M. *_* B.的帖子

在Fortran睡觉

有没有人知道在Fortran中以一定的毫秒数睡眠的方法?我不想使用非便携式系统调用,因此Fortran或C库固有的任何东西都是首选.

fortran fortran-iso-c-binding

16
推荐指数
2
解决办法
9338
查看次数

从python中的共享fortran库调用函数

我想从Python中的Fortran共享库中调用一些函数.我在网上找到了一些链接并阅读它们,根据我的发现,我应该这样做

libadd = cdll.LoadLibrary('./libbin.so') 
Run Code Online (Sandbox Code Playgroud)

加载共享对象.但是,此共享对象包含来自另一个共享库的一些符号.我阅读了cdll的帮助,但似乎无法同时加载多个共享对象文件.我怎样才能调用这个Fortran库中的函数,这个库很可能是由英特尔Fortran编译器编译的?

python fortran fortran-iso-c-binding

15
推荐指数
2
解决办法
5812
查看次数

从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接口

现在,我已经对此持续了大约一个星期,并且在论坛之后搜索了论坛,以便清楚地解释如何从C发送char*到FORTRAN.为了让事情更令人沮丧,从FORTRAN向C发送char*参数是直截了当的......

从FORTRAN发送char*参数到C(这很好):

// The C header declaration (using __cdecl in a def file):
extern "C" double GetLoggingValue(char* name);
Run Code Online (Sandbox Code Playgroud)

来自FORTRAN:

! The FORTRAN interface:
INTERFACE
    REAL(8) FUNCTION GetLoggingValue [C, ALIAS: '_GetLoggingValue'] (name)
        USE ISO_C_BINDING       
        CHARACTER(LEN=1, KIND=C_CHAR), DIMENSION(*),    INTENT(IN) :: name                  
    END FUNCTION GetLoggingValue
END INTERFACE

! Calling the function:
GetLoggingValue(user_name)
Run Code Online (Sandbox Code Playgroud)

当尝试使用类似逻辑从C返回char*时,我遇到问题后出现问题.我觉得应该尝试的一个尝试是:

// The C declaration header (using __cdecl in a def file):
extern "C" const char* GetLastErrorMessage();
Run Code Online (Sandbox Code Playgroud)

和FORTRAN接口:

INTERFACE
    FUNCTION GetLastErrorMessage [C, ALIAS: '_GetLastErrorMessage'] ()
        USE ISO_C_BINDING   
        CHARACTER(LEN=1, KIND=C_CHAR), DIMENSION(255), :: …
Run Code Online (Sandbox Code Playgroud)

c fortran interface char fortran-iso-c-binding

11
推荐指数
3
解决办法
6754
查看次数

使用C++中的可选参数调用Fortran子例程

如何在使用可选参数的C++头中引用Fortran函数?我可以在标题中为每个可能的呼叫组合设置原型吗?或者这甚至可能吗?

例如,Fortran:

subroutine foo(a, b, c) bind(c)
   real, intent(in), optional :: a, b, c
   ...
end subroutine foo
Run Code Online (Sandbox Code Playgroud)

c++ fortran optional-parameters fortran-iso-c-binding

9
推荐指数
2
解决办法
674
查看次数

从C库头自动生成Fortran 2003绑定(使用iso_c_bindings内部模块)

有没有使用Fortran 2003标准的内部模块从C库头自动生成Fortan 绑定的工具iso_c_bindings

我对 C 转换为Fortran 不感兴趣,但只生成绑定.

c binding fortran fortran2003 fortran-iso-c-binding

8
推荐指数
1
解决办法
706
查看次数

C相当于Fortran名单

我习惯了Fortran,我使用namelist顺序读入来从文件中获取变量.这允许我有一个看起来像这样的文件

&inputDataList
n = 1000.0 ! This is the first variable
m = 1e3 ! Second
l = -2 ! Last variable
/
Run Code Online (Sandbox Code Playgroud)

我可以通过它的名称命名变量,然后分配一个值以及后面的注释来说明变量实际是什么.装载非常简单

namelist /inputDataList/ n, m, l
open( 100, file = 'input.txt' )
read( unit = 100, nml = inputDataList )
close( 100 )
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,C中有类似的东西吗?或者我是否必须通过在'='处切断字符串来手动执行此操作?

c variables file-io fortran fortran-iso-c-binding

8
推荐指数
1
解决办法
2301
查看次数

套接字编程gfortran

我希望能够在我的Fortran应用程序中调用网络功能.我的老板要我在Fortran中做所有事情,而不是使用C和Fortran.我们已经在Windows上使用PGI的Fortran编译器完成了该应用程序的一个版本.我们正在将它转移到Linux,我们可能会使用它们的编译器.现在,我正在使用gfortran.

我为这些网络调用创建了一个接口,所有内容都编译和链接.下面的代码类似于我正在做的事情,除了接口和常量在模块中.

PROGRAM MAIN

    INTEGER,PARAMETER  ::AF_INET = 2
    INTEGER,PARAMETER  ::SOCK_STREAM = 1
    INTEGER,PARAMETER  ::IPPROTO_TCP = 6

    INTERFACE
      FUNCTION socket(domain,type,protocol)
        INTEGER  ::socket,domain,type,protocol
      END FUNCTION
    END INTERFACE

    sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
    WRTIE(*,*)"Socket returned: ",sock

END PROGRAM
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,套接字函数返回-1失败.我真的不知道发生了什么.我没有在命令行上添加任何库,所以我猜它正在正确链接默认库.我编译使用

gfortran -o MAIN_PROGRAM MAIN_PROGRAM.f90 -fno-underscoring
Run Code Online (Sandbox Code Playgroud)

sockets linux networking fortran fortran-iso-c-binding

7
推荐指数
1
解决办法
3103
查看次数

在Fortran派生类型中保存指向C函数的指针

我有一个从C程序调用的Fortran DLL,我的一个程序需要定期调用由C程序提供的回调函数.我目前在它的'简单'形式下运行良好,但我希望能够将我的回调指针存储在派生类型中,以便它可以更容易地在我的Fortran代码中传递.到目前为止,我尝试过的任何东西似乎都没有用.

首先,这是我目前所拥有的,这确实有效:

从C(OK,实际上是C++)程序开始,回调的头部原型是:

typedef void (*fcb)(void *)
Run Code Online (Sandbox Code Playgroud)

Fortran调用的原型是:

extern "C" __declspec(dllexport) int fortran_function(int n,
                                                      uchar *image_buffer,
                                                      fcb callback,
                                                      void *object);
Run Code Online (Sandbox Code Playgroud)

实际的回调函数是:

void callback(void* pObject)
{
    // Cast the void pointer back to the appropriate class type:
    MyClass *pMyObject = static_cast<MyClass *>(pObject);
    pMyObject -> updateImageInGUI();
}
Run Code Online (Sandbox Code Playgroud)

并且从C++调用Fortran代码是:

int error = fortran_function(m_image.size(), m_image.data, callback, this);
Run Code Online (Sandbox Code Playgroud)

其中m_image是图像数据的数组,它是当前对象的成员属性.会发生什么是C++将原始图像数据传递给Fortran DLL并要​​求Fortran处理它,因为这需要很长时间Fortran定期更新图像缓冲区并调用回调来刷新GUI.无论如何,继续前进到Fortran端,我们为C回调定义了一个接口:

abstract interface
    subroutine c_callback(c_object) bind(c)   
        use, intrinsic :: iso_c_binding
        type(c_ptr), intent(in) :: c_object     
    end subroutine c_callback
end interface
Run Code Online (Sandbox Code Playgroud)

并定义我们的主要Fortran例程:

integer(c_int) …
Run Code Online (Sandbox Code Playgroud)

c interop fortran derived-types fortran-iso-c-binding

6
推荐指数
1
解决办法
1194
查看次数

如何从fortran访问C指针?

我将值分配给状态数组,如下所示:

status [i] + = 1;

我想从fortran访问这个数组
如何访问这个数组?
例如,我想从fortran更改STAT的值,如下所示:

STAT(2)= 3

这可能吗?

c来源

#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/stat.h>

void call_fc_ (int *key, int *addr, int *size, int *status)
{
    int i;
    int shmid;
    void* shared_addr;

    //printf("first ptr = %p\n", *addr);

    shmid = shmget (*key, *size, IPC_CREAT | IPC_EXCL | 0666);
    if (shmid == -1)
    {
        printf("shmget is failed!\n");
        exit(0);
    }
    shared_addr = (void*) shmat(shmid, 0, 0);
    status = (int*)shared_addr;
    //printf("status ptr = %p\n", status);

    int data_size = …
Run Code Online (Sandbox Code Playgroud)

c fortran fortran-iso-c-binding

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