C语言中等价于Fortran的namelist

8

我习惯使用Fortran语言中的namelist顺序读取方式,从文件中获取变量值。这种方法可以让我像下面这样组织文件:

&inputDataList
n = 1000.0 ! This is the first variable
m = 1e3 ! Second
l = -2 ! Last variable
/

我可以通过编写相应的代码来为变量命名并赋值,同时也可以添加注释以说明该变量的实际含义。这样的操作非常简单,只需按照以下步骤进行即可:
namelist /inputDataList/ n, m, l
open( 100, file = 'input.txt' )
read( unit = 100, nml = inputDataList )
close( 100 )

现在我的问题是,C语言中是否有类似的东西?还是我需要手动地将字符串切割在“=”等符号处?

我不熟悉Fortran,但我从未听说过C语言中有这样的事情。 - daniel gratzer
1
我不相信C语言有类似的东西;但是顺便提一下,NAMELIST不必是连续的。 - Kyle Kanos
C语言中没有相对应的功能。也许有人编写了C代码来实现这个功能……你可以尝试搜索。 - M. S. B.
6
如果您已经有一个从namelist文件中获取数据的Fortran过程,您可以从C程序中调用该过程。请查阅ISO_C_BINDING内置模块,它可以让您指定C程序将看到的Fortran过程的确切名称。 - milancurcic
2个回答

11

这是一个简单的示例,可以让您从C中读取Fortran namelist。我使用了您在问题中提供的namelist文件input.txt

Fortran子程序nmlread_f.f90(请注意使用了ISO_C_BINDING):

subroutine namelistRead(n,m,l) bind(c,name='namelistRead')

  use,intrinsic :: iso_c_binding,only:c_float,c_int
  implicit none

  real(kind=c_float), intent(inout) :: n
  real(kind=c_float), intent(inout) :: m
  integer(kind=c_int),intent(inout) :: l

  namelist /inputDataList/ n,m,l

  open(unit=100,file='input.txt',status='old')
  read(unit=100,nml=inputDataList)
  close(unit=100)

  write(*,*)'Fortran procedure has n,m,l:',n,m,l

endsubroutine namelistRead

关于C程序,nmlread_c.c

#include <stdio.h>

void namelistRead(float *n, float *m, int *l);

int main()
{
  float n;
  float m;
  int   l;

  n = 0;
  m = 0;
  l = 0;

  printf("%5.1f %5.1f %3d\n",n,m,l);

  namelistRead(&n,&m,&l);

  printf("%5.1f %5.1f %3d\n",n,m,l);   
}

还要注意,nml需要声明为指针,才能通过引用将它们传递给Fortran例程。

在我的系统上,我使用英特尔编译器套件进行编译(我的gcc和gfortran已经很旧了,请不要问)。

ifort -c nmlread_f.f90
icc -c nmlread_c.c
icc nmlread_c.o nmlread_f.o /usr/local/intel/composerxe-2011.2.137/compiler/lib/intel64/libifcore.a

运行 a.out 会产生预期的输出:

  0.0   0.0   0
 Fortran procedure has n,m,l:   1000.000       1000.000              -2
1000.0 1000.0  -2

您可以编辑上述Fortran程序,使其更加通用,例如从C程序中指定名称列表文件名和列表名称。


4

我已经在GNU编译器v4.6.3下进行了上述答案的测试,并且完美地运行了。以下是我进行相应编译所做的内容:

gfortran -c nmlread_f.f90
gcc -c nmlread_c.c
gcc nmlread_c.o nmlread_f.o -lgfortran

1
我不明白为什么C和Fortran代码不能使用GCC编译器。为什么不直接使用gfortran nmlread_f.f90 nmlread_c.c呢? - Vladimir F Героям слава

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接