0

我需要通过引用将数组传递给子程序。而不是这个解释器复制矩阵。MAIN 中的静态矩阵仍然像{{0,0}{0,0}{0,0}}. 我知道在fortran中所有的变量都是通过引用传递的。我做错了什么?

 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
4

2 回答 2

1

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

您有什么证据表明您的“解释器”复制了矩阵?(我在解释器这个词两边加上了引号,因为我认为你没有正确使用这个词。)

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

最后,一些不受欢迎的建议:将程序end语句移到整个源代码的末尾,并在pause第 9 行的语句之后插入仅包含单词的行contains。这种重新排列将使您的子程序成为程序内部的子程序,并且您的编译器将生成代码以确保正确调用它们——使用正确数量的正确类型的参数,诸如此类。您还必须在结束子例程定义subroutine的语句上加上这个词。end

于 2013-02-18T10:09:00.417 回答
-1

我的讲师建议使用通用积木。语法 COMMON/tag/variableName。这就像 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
于 2013-02-18T17:28:40.727 回答