Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Fortran 77。按引用传递数组_Arrays_Fortran77 - Fatal编程技术网

Arrays Fortran 77。按引用传递数组

Arrays Fortran 77。按引用传递数组,arrays,fortran77,Arrays,Fortran77,我需要通过引用将数组传递给子进程。代替此解释器,复制矩阵。静态矩阵在MAIN中保持为{{0,0}{0,0}{0,0}}。我知道在fortran中,所有变量实际上都是通过引用传递的。我做错了什么 PROGRAM LAB1 IMPLICIT NONE Real pointsOfTriangle(2,3) call newTriangle(pointsOfTriangle) call getTriangle(pointsOfTriangle) pause

我需要通过引用将数组传递给子进程。代替此解释器,复制矩阵。静态矩阵在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

我现在已经编译了您的代码,修复了第10行中的拼写错误,并运行了它。它似乎工作得很好

你有什么证据证明你的“译员”复制了矩阵?(我在“解释器”一词周围加了引号,因为我认为您使用的术语不正确。)

你用fortran写下你所知道的所有变量实际上都是通过引用传递的。你错得很微妙。Fortran标准不要求处理器(您称之为“解释器”的标准术语,除此之外还有一点)通过引用传递参数,只是要求它们的行为就像它们这样。在幕后,处理器可以自由地做它喜欢做的事情,我认为在过去,一些编译器的参数是由小精灵传递的。撇开这一点不谈,我使用过的大多数Fortran处理器(以及我目前使用的所有Fortran处理器)在默认情况下都是通过引用传递参数的,因此我认为,对于您来说,使用一个没有引用的Fortran处理器是不寻常的。这就是为什么我想知道为什么你认为你的手机有这种不寻常的功能。您甚至可以告诉我们您使用的编译器


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

我的讲师建议使用公共块。语法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

天哪,在这个时代还有人在教Fortran吗?甚至是77版本。无论OP写的代码不是FORTRAN 77,FORTRAN 90都引入了隐式无。@George:trinagle是一个有三个顶点的多项式。我使用open watcom编译器。那里支持Fortran'77和90中的一些功能。如果你设置编译器标志来警告你访问未初始化变量,它会发现你的拼写错误。在2013年推荐通用块就像建议驾车者在汽车里放一个备用的玻璃罐石油馏出物。不要这样做。如果你的讲师建议你这么做,那就把他或她揍一顿。