간결한 제목으로 어려움을 겪고 있지만 복잡하지는 않습니다. 구조 (파생 된 형식) 반환하는 함수가 및 복사/다른 구조를 가리 키지 않고 함수를 호출하는 동안 구조체의 일부만 참조하는 간단한 방법을 찾고 있어요.구조체/파생 형식을 반환하는 함수 참조
program main
real :: xx = 1.
real :: yy = 2.
! works fine but what I want is to be
! able to return %tx and %ts separately
print *, " tax ", tax(xx,yy)
! just guessing at possible syntax here, but neither works
print *, " tax ", tax%tx(xx,yy)
print *, " tax ", tax(xx,yy)%tx
contains
function tax(x,y)
real :: x, y
type tTax
real :: tx, ty
end type tTax
type(tTax) :: tax
tax%tx = x * 100.
tax%ty = y * 100.
end function tax
end program main
f90/f95 기능 세트로 제한되지만 f2003 답변도 포함시켜 주시기 바랍니다.
그리고 나는 그것이 존재한다면 여기에 간단한 것을 정말로 찾고 있습니다. 그렇지 않으면, 서브 루틴으로 대체하는 것이 더 나을 것입니다 (대안으로 함수를 포인터로 유지하면서 포인터, 인터페이스 등을 추가하는 경우).
구조체 대신 2 차원 배열을 반환하고 동일한 기본 문제가 발생했습니다. 작동하지만 모든 배열 섹션을 인쇄 할 수는 없습니다.
심지어는 ()
이 색인 및 색인을 위해 []
을 사용하는 python과 같은 언어와 달리 Fortran의 함수와 배열 섹션에 모두 사용되므로이 구문에서 추측하기가 어려웠습니다. 따라서 함수와 색인을 섞어도되는 것은 당연합니다. tax(xx,yy)[1,:]
).
감사합니다. +1. 이 질문에서 짐작했던 것처럼 fortran은이 추가 작업을 수행하여 실용적인 관점에서 볼 때 조금 더 단순한 서브 루틴을 사용할 수 있습니다. 현재는 테스트 할 새 컴파일러가 충분하지 않습니다. 어쨌든. ;-)하지만 이것은 멋지다, 고마워! – JohnE
f2003 없이는 main에서'associate()'를 사용할 수 없다는 것을 알고 있습니다.하지만 모듈 자체만으로 컴파일해야합니까? 내 f90 컴파일러는 tTax 이름을 사용하여 유형 및 인터페이스에 대해 불평하지만 별도로 컴파일합니다 (물론 주 인터페이스는 해당 경우 작동하지 않습니다). tx가 아니라 main에서 foo % tx를 사용할 수 있다면 내 perspecive에서 충분한 해결책이 될 것입니다. – JohnE
@VladimirF 또는 jlok : 여기 내 의견에 대한 쉬운 대답이 있습니까? 또는 별도의 질문으로 질문 할 가치가 있습니까? – JohnE