Fortran 77.通过引用传递数组

时间:2013-02-17 08:31:32

标签: arrays fortran77

我需要通过引用将数组传递给subrobroutine。而不是这个解释器制作矩阵的副本。 MAIN中的静态矩阵仍然像{{0,0}{0,0}{0,0}}。我知道在fortran所有的变种通过参考defauly传递。我做错了什么?

 PROGRAM LAB1
    IMPLICIT NONE
    Real pointsOfTriangle(2,3)
    call newTriangle(pointsOfTriangle)
    call getTriangle(pointsOfTriangle)

    pause
  END

  SUBROUTINE newTriangle(pointsOfTrinagle)
    IMPLICIT NONE
    Real pointsOfTriangle(2,3)
    Integer i

    do i=1,3
        print *,'enter x,y:'
        read *,pointsOfTriangle(1,i),pointsOfTriangle(2,i)
    end do

    do i=1,3
        print *,'x[', i,']=',pointsOfTriangle(1,i)
        print *,'y[', i,']=',pointsOfTriangle(2,i)
        print *,' '
    end do

  END

  SUBROUTINE getTriangle(pointsOfTriangle)
    IMPLICIT NONE
    Real pointsOfTriangle(2,3)
    Integer i

    do i=1,3
        print *,'x[', i,']=',pointsOfTriangle(1,i)
        print *,'y[', i,']=',pointsOfTriangle(2,i)
        print *,' '
    end do

  END

2 个答案:

答案 0 :(得分:1)

我现在编译了你的代码,修复了第10行中的拼写错误,然后运行它。它似乎工作正常。

你有什么证据表明你的'翻译'会复制矩阵? (我在单词解释器周围加上了引号,因为我认为你没有正确使用这个术语。)

你通过引用写下你知道在fortran所有变种中。你巧妙地误会了。 Fortran标准不要求处理器(你称之为“解释器”的标准术语,以及更多的处理器)通过引用传递参数,只是它们的行为就像它们那样。在幕后,处理器可以自由地做它喜欢的事情,我认为在过去,一些编译器的论点被小精灵传递。除此之外,我曾经使用过的大多数Fortran处理器(以及我目前使用的所有处理器)默认情况下通过引用传递参数,所以我认为你有一个没有的东西是不寻常的。这就是为什么我想知道为什么你认为你的这个有不寻常的特征。你甚至可以告诉我们你正在使用什么编译器。

最后,一些未经考虑的建议:将您的计划end语句移至整个源的末尾,并在第9行的pause语句后插入仅包含单词contains的行。这种重新排列将使您的子程序在程序内部,并且您的编译器将生成代码以确保它们被正确调用 - 使用正确类型的正确数量的参数,这类事物。您还必须在结束子例程定义的subroutine语句中加上end这个词。

答案 1 :(得分:-1)

我的讲师建议使用通用块。语法COMMON / tag / varibleName。这就像C / C ++中的全局变量,但更安全,因为您指定了哪些函数和子例程可以在那里看到。

常见块的一个功能。

COMMON/vertex/x1,y1,x2,y2,x3,y3 

这是有效的,因为数组变量是一致的。

  PROGRAM LAB1
    IMPLICIT NONE
    Real pointsOfTriangle(2,3)
    COMMON/vertex/pointsOfTriangle
    call newTriangle(pointsOfTriangle)
    call getTriangle(pointsOfTriangle)

    pause
  END

  SUBROUTINE getTriangle
    IMPLICIT NONE
    Real pointsOfTriangle(2,3)
    COMMON/vertex/pointsOfTriangle
    Integer i

    do i=1,3
        print *,'x[', i,']=',pointsOfTriangle(1,i)
        print *,'y[', i,']=',pointsOfTriangle(2,i)
        print *,' '
    end do

  END