为什么Fortran代码会出现分段错误?

幸之

下面的fortran代码遇到分段错误。然而,当我修改print*,pow(10_8,i)print*,pow(j,i),它的工作原理没有呕吐分段错误。为什么?这很奇怪。

module mdl
    implicit none
    integer(kind=8)::n,m=1000000007
    integer(kind=8)::p(1000),k(1000),div(10000000)
contains

    integer(kind=8) function pow(a,pwr)
        implicit none
        integer(kind=8)::a,pwr
        integer(kind=8)::cur
        cur=pwr
        pow=1
        do while(cur>0)
            if(mod(cur,2)==1)pow=mod(pow*a,m)
            a=MOD(a*a,m)
            cur=cur/2
        end do
    end function
end module



program main
    use mdl
    implicit none
    integer(kind=8)::i,j,l,r,x,y
    i=2
    j=10
    print*,pow(10_8,i)
    print*,i
end program
法国

这里的问题在于a函数的参数pow在函数中,该参数a(可能)在行上被修改

            a=MOD(a*a,m)

10_8引用该函数时,实际参数是文字常量,不能修改。这是您的程序失败时。当使用时print*,pow(j,i)j变量可以被修改,并且程序不会失败。

这里发生了很多复杂的事情,在这个答案中我不会完全解释(您可以搜索其他问题)。一个主题是参数关联,它说明了为什么要尝试修改常量10_8但是,我会说一些关于虚拟参数意图的事情

dummy参数a未指定意图。当您打算在a输入函数时使用的值,并且希望(可能)对其进行修改时,应该使用适当的意图intent(inout)如果应用此方法,则应该发现编译器抱怨该分配行。

毫无疑问(例如在问题中)是可以接受的。这具有一定的意义即,是否a可以修改取决于引用该函数时的实际参数是否可以。当实际的论据10_8不是时;当它是j它的可能。

至关重要的是,检查程序是否在此做某事不是您的责任,而是您的责任。

现在,j即使允许,您可能也不想修改实际参数您有两种选择:

  • 您可以制作一个临时的本地副本(并标记aintent(in)),可以安全地对其进行修改;
  • 您可以使用value属性为输入数据制作匿名可修改的副本

您首先要使用cur=pwr作为第二个示例:

integer(kind=bigint) function pow(a,pwr)
    implicit none
    integer(kind=bigint), value :: a, pwr
    pow=1
    do while(cur>0)
        if(mod(pwr,2)==1)pow=mod(pow*a,m)
        a=MOD(a*a,m)
        pwr=pwr/2
    end do
end function

您现在甚至可以将其标记pow为纯函数。

最后,如果使用该value属性,则在引用该函数时要求显式接口可用。使用此功能的模块时,这里就是这种情况,但是在更一般的情况下需要考虑这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C Linux中使用共享内存尝试IPC时为什么会出现分段错误

为什么运行此代码时出现分段错误?

当直接从共享库调用CUDA内核时,为什么会出现分段错误?

为什么会出现此错误?-分段错误(核心已转储)

为什么我的代码出现分段错误?

为什么我的以下代码出现分段错误?

在链表中附加节点-为什么会出现分段错误?

为什么会出现错误:ADB退出代码为1

每当尝试运行此LinkedList删除功能时,为什么会出现分段错误错误?

我只是想知道为什么以下代码在执行时不会出现分段错误

为什么会出现错误代码1215?

为什么会出现分段错误?

为什么这段代码会出现分段错误?

编译 Rcpp 代码会出现分段错误

为什么这段代码会出现解析错误?PHP

为什么更改此代码时会出现“分段错误”错误?

为什么在评论 malloc() 调用时会出现分段错误(核心转储)?

为什么这个 POSIX 共享内存代码会出现分段错误?

为什么基本 Flask 代码会出现 404 错误?

为什么当我在函数内修改链表时会出现分段错误?

为什么我在以下代码中出现分段错误?

为什么这段代码会出现分段错误?

为什么会出现此分段错误?

无法找出为什么我会出现分段错误

为什么会出现分段错误?我究竟做错了什么?

为什么此代码段会出现分段错误?

为什么从类调用 printf 时会出现分段错误?

为什么使用 strcmp 会出现分段错误?

为什么我的代码会出现类型错误?