子例程的参数列表中的语法错误

夏天的阿扎德

我正在尝试使用gfortran编译代码。子例程plumed_f_gcmd是我遇到麻烦的地方。这是一段代码

        call plumed_f_gcmd("setMDTimeUnits"//char(0),timeUnits)
        call plumed_f_gcmd("setPlumedDat"//char(0),"plumed.dat"//char(0))
        call plumed_f_gcmd("setLogFile"//char(0),"PLUMED.OUT"//char(0))
        call plumed_f_gcmd("setNatoms"//char(0),natms)
        call plumed_f_gcmd("setMDEngine"//char(0),"dlpoly1.90"//char(0))

编译器将引发以下错误:

call plumed_f_gcmd("setPlumedDat"//char(0),"plumed.dat"//char(0
                                                               1
Error: Syntax error in argument list at (1)

call plumed_f_gcmd("setMDEngine"//char(0),"dlpoly1.90"//char(0)
                                                               1
Error: Syntax error in argument list at (1)

首先,我不太了解子例程中的第二个输入可以是数字还是字符串?的确'//char(0)'在某种程度上改变到另一个字符串数据类型?有人可以向我解释一下吗?

我的第二个问题是,为什么对于第三行(PLUMED.OUT)也不会发生错误?

我不知道如何,但是也涉及一些C和C ++包装器。这是C中的子例程:

void plumed_f_gcmd(char*key,void*val){
   plumed_gcmd(key,val);
}
罗格维布

如注释中所建议,错误消息

错误:(1)的参数列表中的语法错误

出现这种情况的可能性最大,因为您的Fortran代码是以固定格式编写的,并且编译器仅处理前72个字符。为避免这种情况,请尝试使用类似的选项

gfortran -ffixed-line-length-none yourcode.f

允许任何长度的线。第三行(带有“ PLUMED.OUT”)没有发生错误的原因可能是该行在72个字符以内(但非常接近!)


至于char(0)(空字符),这是附加到Fortran字符串上的,以便C例程可以将它们作为以空字符结尾的string进行处理请注意,//在Fortran中,它表示字符串串联(类似于"hello" + "world"其他语言),而不是将字符串更改为另一种数据类型的特殊操作。


至于为什么第二个参数plumed_f_gcmd()可以是一个数字和一个字符串,我想这个例程可能会读取第一个参数(或“命令”)并在某些例程中进行适当的类型转换(有关详细信息,请参见原始代码) 。以下是这样的示例,其中将整数,实数和字符串变量传递到同一例程sub()

f90堡:

program main
    implicit none
    integer       :: intval
    real          :: realval
    character(50) :: str

    intval = 777 ; realval = 3.14 ; str = "world"

    call sub( "ShowInteger" // char(0), 100    )
    call sub( "ShowInteger" // char(0), intval )

    call sub( "ShowReal"    // char(0), 1.0     )
    call sub( "ShowReal"    // char(0), realval )

    call sub( "ShowString"  // char(0), "hello"   // char(0) )
    call sub( "ShowString"  // char(0), trim(str) // char(0) )
end

sub.c:

#include <stdio.h>
#include <string.h>

void sub_ ( char* cmd, void* ptr )
{
    printf( "command = %s\n", cmd );

    if ( strcmp( cmd, "ShowInteger" ) == 0 ) printf( "int   : %20d\n",   *((int*)ptr) );
    if ( strcmp( cmd, "ShowReal"    ) == 0 ) printf( "float : %20.5f\n", *((float*)ptr) );
    if ( strcmp( cmd, "ShowString"  ) == 0 ) printf( "str   : %20s\n",    (char*)ptr ); 
}

编译

gfortran -c fort.f90
gcc -c sub.c
gfortran fort.o sub.o

结果

command = ShowInteger
int   :                  100
command = ShowInteger
int   :                  777
command = ShowReal
float :              1.00000
command = ShowReal
float :              3.14000
command = ShowString
str   :                hello
command = ShowString
str   :                world

(请注意,上述C例程对于gcc / gfortran以外的编译器可能不是可移植的。要使其可移植,请使用现代Fortran的互操作性功能,例如,本页)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

行被截断,参数列表中的语法错误

来自分类Dev

参数列表后语法错误:缺少)

来自分类Dev

语法错误:在简单函数的参数列表后缺少)

来自分类Dev

Javascript语法错误:在列表61上的参数列表后缺少)

来自分类Dev

使用electron-builder时,参数列表后语法错误:缺少)

来自分类Dev

语法错误:参数列表后缺少“)” - 我该如何解决?

来自分类Dev

子查询中的MySQL语法错误

来自分类Dev

函子中的OCaml语法错误

来自分类Dev

cmd参数中的语法错误

来自分类Dev

列表理解中的无效语法错误

来自分类Dev

列表中的#<eof>时出现球拍错误的语法错误

来自分类Dev

索引由子例程返回的列表-语法

来自分类Dev

索引由子例程返回的列表-语法

来自分类Dev

MS-Access SQL语法错误中的子查询

来自分类Dev

可能的语法错误?从用户窗体的子调用中“期望=”

来自分类Dev

随机选择的子查询选择中的sql语法错误

来自分类Dev

求和函数语法错误中的正确子查询

来自分类Dev

Python中的参数计数语法错误

来自分类Dev

使用参数在openrowset中执行存储过程的语法错误

来自分类Dev

Python-列表中冒号的语法错误

来自分类Dev

Python-列表中冒号的语法错误

来自分类Dev

在SML中从树创建列表时的语法错误

来自分类Dev

OCaml 中列表的相互递归语法错误

来自分类Dev

ReactJS中的语法错误

来自分类Dev

coffeescript中的语法错误

来自分类Dev

Erlang中的语法错误

来自分类Dev

IE中的语法错误

来自分类Dev

coffeescript中的语法错误

来自分类Dev

Conda中的语法错误