gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:42:13 24 4
gpt4 key购买 nike

我正在尝试使用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);
}

最佳答案

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

Error: Syntax error in argument list at (1)



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

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

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

至于为什么 plumed_f_gcmd()的第二个参数可以是一个数字和一个字符串,我想这个例程可能会读取第一个参数(或“命令”)并在某些例程中进行适当的类型转换(有关详细信息,请参见原始 code)。 )。以下是这样的示例,其中将整数,实数和字符串变量传递到相同的例程 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的互操作性功能,例如this page)。

关于compiler-errors - 子例程的参数列表中的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36647396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com