我正在尝试使用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] 删除。
我来说两句