나는 Fortran 77 (및 구문)을 지난 며칠 동안 배웠으며 사이트 및 교과서에서 이미 답변을 찾지 만 여전히 혼란스러워 보입니다. 나는 어떤 도움을 주셔서 감사합니다. 이 게시물의 서식이 꺼져 있으면 죄송합니다. 이것은 내 첫 번째 게시물이며, 나는 시간을 위해 crunched 해요.Fortran 77 : 함수 또는 서브 루틴에서 배열 출력을 사용하는 방법
매트릭스를 곱하는 프로그램을 만들고 있습니다. 두 개의 행렬을 입력 (두 개의 2x2 배열)으로 사용하고 곱해진 행렬 (하나의 2x2 배열)을 반환하는 서브 루틴이나 함수를 만들고 싶습니다. 서브 루틴이나 함수를 사용하여 고정 된 크기의 배열을 반환하는 방법이나 반환 된 배열을 사용하는 방법을 알아낼 수 없습니다.
나는 자체적으로 컴파일 된 함수를 사용해 보았습니다. 내 메인 프로그램에서 함수를 호출 시도 때, 나는 스스로를 호출 할 수 있습니다 :
:BLAH = MATMULT(MAT0, MAT0, MAT0) 1 Error: Return type mismatch of function 'matmult' at (1) (INTEGER(4)/REAL(4)) MATRIX1.f:26.22: BLAH = MATMULT(MAT0, MAT0, MAT0) 1 Warning: Type mismatch in argument 'x' at (1); passed INTEGER(4) to REAL(4) BLAH = MATMULT(MAT0, MAT0, MAT0) 1 Warning: Rank mismatch in argument 'x' at (1) (scalar and rank-2)
MATMULT(MAT0, MAT0, MAT0) 1 Error: Unclassifiable statement at (1)
을하거나 다른 변수에 할당 (I 다른 REAL이와 배열을 시도)
배열을 참조로 전달했기 때문에 함수가 무엇을 반환하는지 잘 모르겠습니다. 실제로 함수의 출력 인 경우 출력 매트릭스를 어떻게 사용할 수 있습니까?
서브 루틴을 사용해 보았지만 (무엇이 반환되는지 또는 어디에 있는지도 알지 못함) "두 개의 주요 프로그램"오류가 발생합니다. 따라서 컴파일러는 주 프로그램과 서브 루틴을 구별하지 않습니다 . 서브 루틴에 대한 내 구문에 문제가있을 수 있습니까? 나는 몇 가지 다른 일을 시도했지만 여기에 코드 내 가장 최근의 반복 (난 그냥 배열 전달하는 일에, 그래서 아직 여기에 실제 행렬 곱셈이 아니다 얻을려고)입니다 :
PROGRAM MATRIX1 INTEGER N REAL A, B, MAT0(2,2), MATF(2,2), X(2,2), Y(2,2), Z(2,2) REAL BLAH PRINT *, " ENTER THE VALUE OF A: " READ *, A PRINT *, " ENTER THE VALUE OF B: " READ *, B PRINT *, " ENTER THE NUMBER OF MULTIPLICATIONS: " READ *, N
C Creates the initial matrix
MAT0(1,1) = 1.0 - A MAT0(1,2) = A MAT0(2,1) = B MAT0(2,2) = 1.0 - BPRINT *, "M = ", MAT0 CALL MATMULT(MAT0, MAT0, MAT0) PRINT *, "FINAL " STOP END PROGRAM REAL SUBBROUTINE MATMULT(X, Y, Z) END SUBROUTINE
또는 함수와 (권장 변경 사항 중 일부를 추가 편집) :
PROGRAM MATRIX1 INTEGER N REAL A, B, MAT0(2,2), MATF(2,2), X(2,2), Y(2,2), Z(2,2) REAL MATMULT(2,2) PRINT *, " ENTER THE VALUE OF A: " READ *, A PRINT *, " ENTER THE VALUE OF B: " READ *, B PRINT *, " ENTER THE NUMBER OF MULTIPLICATIONS: " READ *, N
C Creates the initial matrix
MAT0(1,1) = 1.0 - A MAT0(1,2) = A MAT0(2,1) = B MAT0(2,2) = 1.0 - BPRINT *, "M = ", MAT0 Z = MATMULT(X, Y) STOP END PROGRAM FUNCTION MATMULT(X, Y) REAL X(2,2), Y(2,2), Z(2,2), MATMULT(2,2) RETURN END
I 해요 여전히 점점 오류 :이 작업을 수행하는 방법은 두 가지가 있습니다
Z = MATMULT(X, Y) 1 Warning: Legacy Extension: REAL array index at (1) MATRIX1.f:28.19: Z = MATMULT(X, Y) 1 Error: Array index at (1) is an array of rank 2
여기서 제기하는 몇 가지 문제가 있지만 대부분의 오류를 제공 한 코드 샘플과 일치시킬 수 없습니다. – francescalus
저는 Fortran77에 자신을 국한시키는 것이 아니라고 생각합니다. 당신은 f77을 가진 배열을 리턴 할 수 없다. 그리고 당신이 이미 금세기의 컴파일러를 사용하고 있다는 것을 나타내는 에러가 없다는 사실. 태그와 제목을 편집해야합니다. – agentp