我想有一个Fortran写语句格式化依赖于某些变量.例如,我可以写:
write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari)
Run Code Online (Sandbox Code Playgroud)
哪里nvari = 3.但是,如果在某些情况下,我实际上有4个变量(即nvari = 4).我想写这样的东西:
write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)
Run Code Online (Sandbox Code Playgroud)
现在,nvari可以是任何东西,输出将按我喜欢的方式工作.我怎样才能做出类似这样的工作?
使用gcc和gfortran我可以生成编译器定义的预处理器宏列表(编辑以反映ouah的答案)
gcc -E -dM - < /dev/null
Run Code Online (Sandbox Code Playgroud)
和
gfortran -cpp -E -dM /dev/null
Run Code Online (Sandbox Code Playgroud)
分别(至少在Linux上).
我如何对英特尔编译器icc和ifort做同样的事情?我知道对于ifort这些宏是在这里定义的,但我希望能够自己生成这个列表,因为使用的确切宏及其值将取决于所使用的编译器选项.我也知道这个预先设计的项目.
有没有办法在gfortran编译器中禁用行长度限制?我正在从ifort移植到gfortran,我想知道是否有一个简单的方法可以不经过代码并在需要的地方手动引入行继续.
Fortran 90模块是渐渐消失的生物.我使用(奇异)模块一段时间取得了一些成功(使用英特尔Visual Fortran和Visual Studio 2010进行编译).然后我写了另一个模块并尝试在另一个函数中使用它,然后才收到此错误:
error #7002: Error in opening the compiled module file. Check INCLUDE paths.
Run Code Online (Sandbox Code Playgroud)
所以我删除了有问题的模块.但是现在我在尝试访问原始模块后收到了同样的错误!
我怎样才能找到这些神秘的生物?为什么一个模块工作但不是两个?我假设我需要删除并重新编译它们,或者告诉编译器以某种方式包含它们.我知道源代码的文件位置,但不知道它们编译的位置.
fortran visual-studio-2010 fortran90 fortran95 intel-fortran
我ifort在mpi环境中使用intel fortran编译器().事实证明,当我使用标志编译时,我的代码有一个缓冲区溢出-g -O2 -check bounds.运行一段时间后,我收到此消息:
forrtl: severe (408): fort: (2): Subscript #1 of the array XX has value 4 which is greater than the upper bound of 3
Image PC Routine Line Source
program.exe 00000000006E757E Unknown Unknown Unknown
program.exe 00000000006E6016 Unknown Unknown Unknown
program.exe 00000000006905B2 Unknown Unknown Unknown
program.exe 0000000000642E6B Unknown Unknown Unknown
program.exe 0000000000643381 Unknown Unknown Unknown
program.exe 00000000005F33FB Unknown Unknown Unknown
program.exe 00000000004139E7 Unknown Unknown Unknown
program.exe 000000000040A6B4 Unknown Unknown Unknown
program.exe 0000000000409D2C Unknown …Run Code Online (Sandbox Code Playgroud) cmake-gui我有一个项目,已成功配置并生成mingw。
但是当我想配置或构建它(cmake -G "Visual Studio 15 2017"
)时Visual Studio 2017 Enterprise,Intel Parallel Studio 2017 (Visual Fortran Compiler)我收到以下错误:
The Fortran compiler identification is unknown
CMake Error at CMakeLists.txt:17 (PROJECT):
No CMAKE_Fortran_COMPILER could be found.
Run Code Online (Sandbox Code Playgroud)
所以我该怎么做?
编辑:
当我使用时cmake -G "Visual Studio 15 2017"我得到:
-- The Fortran compiler identification is unknown
CMake Error at CMakeLists.txt:17 (PROJECT):
No CMAKE_Fortran_COMPILER could be found.
-- Configuring incomplete, errors occurred!
See also "F:/FreshElmer - Copy (3)/elmerfem/CMakeFiles/CMakeOutput.log".
See …Run Code Online (Sandbox Code Playgroud) 我写了一小段代码,试图遵守Fortran 2003标准.代码可以在github上找到.
这是我的makefile:
FC = gfortran
FLGS = -g -pg -std=f2003 -I. -fbounds-check
DEPS = camx.prm
OBJ = unit-test-hadvppm.o hadvppm.o
#linker macro
%.o: %.f03 $(DEPS)
$(FC) -c -o $@ $< $(FLGS)
#build targets
gnu-amd64-linux: $(OBJ)
$(FC) -o $@ $^ $(FLGS)
clean: gnu-amd64-linux
rm *.o
Run Code Online (Sandbox Code Playgroud)
使用上面的makefile和gfortran编译代码没有问题.
但是,如果我尝试用iFort编译它,只需使用
ifort -o ifort-amd64-linux unit-test-hadvppm.f03 hadvppm.f03
Run Code Online (Sandbox Code Playgroud)
它不起作用,请参阅下面的输出.我想这与.f03免费文件格式有关.iFort中有一个标志,类似于gfortran的-std = f2003标志吗?我试着在iFort文档中找到这个,我应该更加努力吗?

我希望更改 Fortran 90 代码中的工作目录。是否可以以非特定于编译器的方式执行此操作?这是我的代码:
program change_directory
integer :: ierr
call system("mkdir -p myfolder/")
!call system("cd myfolder/") !doesn't work
ierr = chdir("myfolder")
if (ierr.NE.0) then
write(*,'(A)') "warning: change of directory unsuccessful"
end if
open(unit=33,file="myfile.txt",iostat=ierr)
if (ierr.EQ.0) then
write(unit=33,fmt='(A)') "Test message"
close(unit=33)
end if
end program change_directory
Run Code Online (Sandbox Code Playgroud)
显然,cd myfolder/在系统调用中使用是行不通的。英特尔参考资料说我需要添加“ use ifport”。不过, GCC 参考文献中没有这样的提及。省略“ ”,我可以毫无问题地use ifport编译上面的代码。ifort然而,当我把它放进去时,它不会用 gcc 编译(因为 gcc 没有该ifport模块)——不仅如此,它也不会在 Intel Fortran 下编译——我收到以下错误:
$ ifort change_dir.f90 -o change_dir
change_dir.f90(5): error …Run Code Online (Sandbox Code Playgroud) 现代 Fortran 包含各种面向对象的思想,包括通过FINAL关键字“析构函数”的概念。
MODULE mobject
TYPE :: tobject
! Data declarations
CONTAINS
FINAL :: finalize
END TYPE
CONTAINS
SUBROUTINE finalize(object)
TYPE(tobject) object
...
END SUBROUTINE
END MODULE
Run Code Online (Sandbox Code Playgroud)
然而,这个功能可靠吗?值得注意的是,我注意到有关何时以及是否会调用它的不一致,英特尔 Fortran 19 和 GFortan 7、8 之间存在主要差异:
我注意到 gfortran-7.4.0 和 gfortran-8.2.1.2 之间没有区别。
这些不一致给我带来了一些关于析构函数的实际可用性的问题。是否有任何一种行为完全符合标准?这个标准不清楚吗?标准是否可能包含导致不直观行为的条款?
程序块。Gfortran 不会为在 PROGRAM 块中声明的实例调用析构函数,而 Ifort 会(参见run1示例)。
标量对象。对于声明为标量的实例,如果变量已经看到任何形式的初始化,Gfortran 和 IFort 都会调用析构函数。然而,英特尔 Fortran 在分配函数返回值时,也会调用它
newObject函数的末尾。然而,这可以通过在执行任何清理之前显式检查对象是否已初始化来防止。
这意味着,程序员必须明确检查实例是否已初始化。
数组中的对象。如果对象包含在数组中,并且数组超出范围,
allocatable …intel-fortran ×10
fortran ×8
gfortran ×3
fortran90 ×2
c ×1
cmake ×1
directory ×1
formatting ×1
fortran2003 ×1
fortran95 ×1
gcc ×1
icc ×1
line-breaks ×1
mingw ×1
preprocessor ×1
windows ×1