gpt4 book ai didi

fortran - 使用 Fortran 获取系统信息

转载 作者:行者123 更新时间:2023-12-04 03:01:09 26 4
gpt4 key购买 nike

我有兴趣通过 Fortran 获取系统信息 - 类别可能包括:

  1. 操作系统名称
  2. 操作系统版本
  3. CPU 架构(32/64 位)
  4. 核心数

据我了解,您可以通过预处理指令获取基本的操作系统信息,例如

#ifdef _WIN32
print *,'Windows'
#ifdef _APPLE_
print *,'macOS'
#ifdef __linux
print *,'Linux'
#endif

这是第 1 类的有效解决方案,但仍保留第 2 - 4 类。

谢谢!

最佳答案

你可以用 Fortran 做所有这些事情,但不是真的。 ISO_FORTRAN_ENV 模块中的 COMPILER_VERSION() 字符串至少应提供操作系统的名称。从中您知道调用什么程序来获取更多信息。

program test
use ISO_C_BINDING
use ISO_FORTRAN_ENV
implicit none
integer, parameter :: bitness = bit_size(0_C_INTPTR_T)
write(*,'(*(g0))') 'This is a ',bitness,'-bit system.'
write(*,'(*(g0))') COMPILER_VERSION()
end program test

这是我使用 gfortran 的输出:

This is a 64-bit system.
GCC version 7.2.0

所以 gfortran 不是很有用。我认为这是一个错误。 ifort 根本没有 COMPILER_VERSION();也许那只是因为我有两个编译器的旧版本。无论如何,如果您可以从 COMPILER_VERSION() 字符串中获取操作系统,您就会知道如何在 Windows 中加载有用的函数,例如 LoadLibraryGetProcAddress .然后创建参数,如果您有正确的操作系统,则使用您想要的操作系统过程的名称,如果没有,则使用 stub 过程的名称。

   logical, parameter :: v0 = index(v5,'WINDOWS') /= 0
character(*), parameter :: v6 = merge('LoadLibraryA','Stub12345678',v0)
interface
function LoadLibrary(lpFileName) bind(C,name=v6)
import
implicit none
!DEC$ ATTRIBUTES STDCALL :: LoadLibrary
!GCC$ ATTRIBUTES STDCALL :: LoadLibrary
integer(C_INTPTR_T) LoadLibrary
character(kind=C_CHAR) lpFileName(*)
end function LoadLibrary
end interface

如果您在 Windows 中,这样您就可以访问 LoadLibrary,如果不是,则不会导致不满意的外部引用。不幸的是,gfortran 认为使用命名常量而不是绑定(bind)名称的字 rune 字是有效的。

但原则上您可以使用编译器来告诉您操作系统名称并设置一些您需要的关键功能,您需要向操作系统请求其余的东西,但它需要比我拥有的更高级的编译器。如果你有一个更好的编译器,我可以编辑更多的东西,你可以看看它是否会在你这边崩溃。

关于fortran - 使用 Fortran 获取系统信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49141093/

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