我需要通过引用将数组传递给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
答案 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