我正在尝试将错误检查纳入我正在编写的纯过程中.我想要像:
pure real function func1(output_unit,a)
implicit none
integer :: a, output_unit
if (a < 0) then
write(output_unit,*) 'Error in function func1: argument must be a nonnegative integer. It is ', a
else
func1 = a/3
endif
return
end function func1
Run Code Online (Sandbox Code Playgroud)
但是,不允许纯函数将IO语句赋予外部文件,因此我尝试将单元号传递给函数,例如output_unit = 6,这是默认输出.gfortran仍然认为这是非法的.有没有解决的办法?是否有可能使函数成为派生类型(而不是real此处的内部类型),在出现错误时输出字符串?
我需要pure在使用gfortran编译的fortran程序中调试一些函数.有没有办法忽略的pure语句,所以我可以使用write,print在这些等pure功能,不花大力气?不幸的是,只是删除pure声明是不可能的.
我最近学会了如何在Fortran中使用基本文件,我认为它很简单:
open(unit=10,file="data.dat")
read(10,*) some_variable, somevar2
close(10)
Run Code Online (Sandbox Code Playgroud)
所以我无法理解为什么我写的这个函数不起作用.它编译得很好但是当我运行它打印:
fortran runtime error:end of file
Run Code Online (Sandbox Code Playgroud)
码:
Function Load_Names()
character(len=30) :: Staff_Name(65)
integer :: i = 1
open(unit=10, file="Staff_Names.txt")
do while(i < 65)
read(10,*) Staff_Name(i)
print*, Staff_Name(i)
i = i + 1
end do
close(10)
end Function Load_Names
Run Code Online (Sandbox Code Playgroud)
我正在使用Fortran 2008和gfortran.
我想知道是否可以选择 Fortran 95 例程的不同部分进行编译。
例如,如果我将某个标志传递给 gfortran,那么编译器会选择将哪个部分用于某个函数。if我知道我可以在例程内部使用它,但缺点是if由于速度问题我不希望程序一直运行。我想解决方案应该类似于这个
我正在专门研究一个计算多体系统(例如,一百万)能量的程序。然后我不想if每次都需要在编译时使用不同的能量定义。
我希望这是可能的,并且我的问题很清楚。
我正在尝试在我的 MacBook 上安装gadgetviewer,但是当我运行时
./configure prefix=/usr/local/bin
Run Code Online (Sandbox Code Playgroud)
经过大量输出后我得到:
checking for g_key_file_new in -lglib-2.0... no
checking how to get verbose linking output from gfortran... configure:
WARNING: compilation failed
checking for Fortran libraries of gfortran...
checking for dummy main to link with Fortran libraries... none
checking for Fortran name-mangling scheme... configure: error: in `/Users/chris/Downloads/gadgetviewer-1.0.7':
configure: error: cannot compile a simple Fortran program
Run Code Online (Sandbox Code Playgroud)
但我已经安装了 gfortran 并正在工作:
$ which gfortran
/usr/local/bin/gfortran
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么它似乎找不到 fortran 编译器?
一如既往地感谢。
电子数据交换1:
我的路径输出是:
$ echo $PATH
Run Code Online (Sandbox Code Playgroud)
/Library/Frameworks/Python.framework/Versions/3.6/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/opt/ldg/ bin:/opt/ldg/sbin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/Users/chris/.local/bin:/Applications/root_v6.06.06/bin:/usr/bin:/bin :/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin
(不允许我将其放入代码块中) …
这是我在R和Fortran中遇到的一个有趣的问题。
考虑以下Fortran子例程:
! foo.f90
subroutine fun(n, x)
implicit none
integer, intent(in) :: n
logical, intent(in) :: x(n)
integer :: i
write(*,*) pack([(i, i=1, n)], x)
end subroutine fun
Run Code Online (Sandbox Code Playgroud)
用R CMD SHLIB foo.f90R 编译并在R中调用时
dyn.load("foo.so")
x <- c(TRUE ,FALSE)
f <- .Fortran("fun", 2L, as.logical(x))
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
Fortran runtime error: Funny sized logical array
Run Code Online (Sandbox Code Playgroud)
从Fortran程序调用相同的子例程时,
! test.f90
program test
implicit none
logical :: x(2)
x = [.true., .false.]
call fun(2, x)
contains
include "foo.f90"
end program test
Run Code Online (Sandbox Code Playgroud)
没有错误发生:
$ …Run Code Online (Sandbox Code Playgroud) 我在新笔记本电脑(在 MacOS Catalina 上运行)上下载了旧的存储库,并尝试运行 R 脚本。
\n该存储库有一个 renv 锁定文件 - 这意味着,我应该能够按原样恢复所有依赖项。
\n但当我运行该renv::restore()命令时,出现以下错误消息:
Installing pbapply [1.4-3] ...\n OK [linked cache]\nInstalling mvtnorm [1.1-2] ...\n FAILED\nError installing package \'mvtnorm\':\n===================================\n\n* installing to library \xe2\x80\x98~/renv/staging/2\xe2\x80\x99\n* installing *source* package \xe2\x80\x98mvtnorm\xe2\x80\x99 ...\n** package \xe2\x80\x98mvtnorm\xe2\x80\x99 successfully unpacked and MD5 sums checked\n** libs\nclang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I/usr/local/include -fPIC -Wall -g -O2 -c C_FORTRAN_interface.c -o C_FORTRAN_interface.o\nclang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I/usr/local/include -fPIC -Wall -g -O2 -c miwa.c -o miwa.o\ngfortran -fPIC -g -O2 -c mvt.f -o mvt.o\nclang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG …Run Code Online (Sandbox Code Playgroud) 当通过 MEX 将一段 Fortran 2003(或更高版本)代码与 MATLAB 连接时,我惊讶地发现MEX 更改了默认逻辑. 这是致命的,因为一段完美编译的 Fortran 代码可能会因为类型不匹配而无法被 mexified,这种情况在我的项目中确实发生过。
\n这是一个最小的工作示例。
\n将以下代码命名为“test_kind.F”,在MATLAB中编译mex test_kind.F,然后test_kind在MATLAB中运行。这将生成一个名为 fort.99 的纯文本文件,其中包含两个数字“4”和“8”作为 WRITE 指令的结果。
! test_kind.F\n! Tested by MATLAB 9.8.0.1323502 (R2020a) with GNU Fortran (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0\n\n#include "fintrf.h"\n\n subroutine mexFunction(nlhs, plhs, nrhs, prhs)\n\n use ieee_arithmetic, only : ieee_is_nan\n implicit none\n mwPointer plhs(*), prhs(*)\n integer nlhs, nrhs\n\n write(99, *) kind(ieee_is_nan(1.0)) ! This prints a number in fort.99\n write(99, *) kind(.false.) ! A benchmark, …Run Code Online (Sandbox Code Playgroud) 每当我尝试编译 Fortran 代码时,都会遇到错误:
% gfortran Testing_Fortran.f90 -o Testing_Fortran
ld: unsupported tapi file type '!tapi-tbd' in YAML file '/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/lib/libSystem.tbd' for architecture x86_64 collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
通过互联网查看类似问题,我发现最常见的解决方案是降级 XCode 命令行工具,并重新安装 gcc,但这些都不起作用。
我尝试了 CLTools 14.1 和 13.4,并且通过自制程序安装 gcc。gfortran 版本是 12.2.0。我使用的是 MacOS Monterey 12.6。
有任何想法吗?提前致谢。