gpt4 book ai didi

fortran - 这个 Fortran 程序有什么问题?

转载 作者:行者123 更新时间:2023-12-02 17:59:42 26 4
gpt4 key购买 nike

我不知道这个自由形式的 Fortran 程序有什么问题。它无法正确处理其命令行参数。

如果我使用静态数组作为命令行参数而不是可分配数组,它就会起作用。

此外,这是一个好的第一个 Fortran 程序吗? Fortran 是否适合解决这种类型的问题?我已经了解 C、C++ 和一点 D。

module fibonacci
use ISO_FORTRAN_ENV
implicit none
contains
subroutine output_fibonacci(ordinal)
! Declare variables
integer, parameter :: LongInt = selected_int_kind (38)
integer, intent(in) :: ordinal
integer :: count
! integer (kind=LongInt) :: count, compare=2
integer (kind=LongInt), dimension(2,2) :: matrix, initial
matrix=reshape((/ 1, 1, 1, 0 /), shape(matrix))
initial=reshape((/ 1, 0, 0, 1 /), shape(initial))
count = ordinal
! Do actual computations
do while (count > 0)
! If the exponent is odd, then the output matrix
! should be multiplied by the current base
if (mod(count,2) == 1) then
initial = matmul(matrix, initial)
end if
! This is the squaring step
matrix = matmul(matrix, matrix)
count = count/2
end do
write (*,*) initial(1,2)
end subroutine output_fibonacci
end module fibonacci
program main
use, intrinsic :: ISO_FORTRAN_ENV
use fibonacci
implicit none
! The maximum allowed input to the program
integer :: max=200, i, size=20
character, allocatable :: argumen(:)
integer :: error, length, input
allocate(argumen(size))

! write(*,*) argcount
do i=1, command_argument_count()
call get_command_argument(i, argumen, length, error)
read(argumen,*,iostat=error) input
! write(*,*) argument
! write (*,*) input
if (error .ne. 0) then
write(ERROR_UNIT,'(I36.1,A)') input, "is not an integer"
stop (1)
else if (input > max) then
write(ERROR_UNIT,'(A,I36.1,A)') "Input ", input, " is too large"
stop (1)
end if
call output_fibonacci(input)
end do
end program

最佳答案

这一行

character, allocatable :: argumen(:)

声明一个可分配的字符数组。所以声明

allocate(argumen(size))

使argumen 20 个单字符元素的数组。这不是 Fortran 和 argumen 中处理字符串的常用方法。与 get_command_argument 调用中第二个参数的要求不匹配(在类型或等级上) 。

相反,你应该写

character(len=:), allocatable :: argumen

申报argumen是可分配长度的字符变量。在某些情况下,您可以简单地分配给这样的变量,例如

argumen = 'this is the argument'

无需事先显式分配它。

使用英特尔 Fortran v14 调用 get_command_argument编译时没有警告,但执行时参数 argumen不会自动分配并且保持未分配状态。老实说,我不确定这种行为是否符合标准。一种方法是两次调用 get_command_argument ,首先获取参数的大小,然后获取参数;像这样

 do i=1, command_argument_count()
call get_command_argument(i, length=length, status=error)
allocate(character(length)::argumen)
call get_command_argument(i, argumen, status=error)
! do stuff with argument
deallocate(argumen)
end do

使用名称 length对于要分配的变量,由名为 length 的可选参数返回的值是合法的,但有点令人困惑。 deallocate声明确保 argumen可以为下一个参数再次分配。

我将留给您声明和使用可分配长度字符的可分配数组的练习。

免责声明:接下来的两段包含一些可能会认为主观的 Material 。我不会对此答案的这些部分进行任何讨论。

这是一个好的第一个 Fortran 程序吗?它比我在 SO 上看到的很多东西都要好。就我个人而言,我更喜欢现代的一致使用 /=.ne. , <.lt (),我不使用stop如果我可以避免它(我通常可以),并且我确信我可以找到其他可以选择的东西。

Fortran 对于这种类型的问题有用吗?Fortran 对于所有类型的问题都很有用,尽管我承认使用它来编写 Web 服务器可能相当具有挑战性。 p>

关于fortran - 这个 Fortran 程序有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20112904/

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