8

我习惯了 Fortran,在其中我使用名称列表顺序读取来从文件中获取变量。这让我有一个看起来像这样的文件

&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 中有没有类似的东西?或者我是否必须通过在“=”等处切断字符串来手动完成?

4

2 回答 2

11

这是一个简单的示例,可让您从 C 中读取 Fortran 名称列表。我使用了您在问题中提供的名称列表文件,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);   
}

还要注意n,ml需要被声明为指针,以便通过引用 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 程序中指定名称列表文件名和列表名称。

于 2013-07-11T16:36:13.900 回答
4

我已经在 GNU 编译器 v 4.6.3 下对上述答案进行了测试,并且对我来说效果很好。这是我为相应的编译所做的:

gfortran -c nmlread_f.f90
gcc -c nmlread_c.c
gcc nmlread_c.o nmlread_f.o -lgfortran
于 2014-08-06T15:46:15.070 回答