class(*)
기능으로 유용한 배열 연산 (요소 추가, 요소 제거, 다른 구현을 할당 가능/포인터/이진 트리 구조)을 실현하고 싶습니다. (무제한 다형성). 그런 기능을 처리해야하는 gfortran 5.0을 사용합니다. 내가 사용하는 각 유형에 대해 동일한 코드를 반복하지 않기를 원합니다.Fortran 03/08 (gfortran 컴파일러)에서 배열 연산에 무제한 다형성 유형 사용
이 문제는 좀 명확한 유형이 기능을 사용하려고 할 때, 나는 결과를 반환에 오류가 있다는 것입니다
function add_element(array,element)
class(*),intent(in)::array(:)
class(*),intent(in)::element
class(*)::add_element(size(array)+1)
add_element=[array,element]
end function
처럼 보일 것이다. 나는 select type
없이 어떤 확실한 타입 변수에 class(*)
을 할당 할 수 없으며, 사용할 때마다 타입 구조를 선택하고 싶지는 않습니다. 서브 루틴 안에는 내가 사용하고자하는 타입에 관해서는 알지 못한다. 왜냐하면 내가 그것들을 많이 만들 것이기 때문이다.
move_alloc
소스와 함께 변종을 시도했는데 intent(out)
인수 등으로 서브 루틴을 사용해 보았습니다. 작동하지 않았습니다. 나는 그것이 인수 속성에서 정의되어야한다고 생각한다. (크기는 소스 키워드로?) 표준에서 그러한 구조의 예제 나 정의를 찾지 못했다. 물론이 표준을 더 공부할 것입니다. (저는 프로 프로그래머가 아니지만 물리학 자들이 내 프로그램을 테스트 할 수 있고, 확인 가능하며, 변경하기가 쉽도록하려고 노력합니다.) 더 나은 솔루션을 기다리면서이 코드를 반복 할 것입니다. 표준 또는 일부 책에서 검색하려면? 배열에 대해서만이 아니라 class(*)
을 사용하는 것이 좋습니다. 형식을 모르는 메서드가 있어야한다고 생각하기 때문에 ...
다른 형식의 예제를 추가해야하는지 모르겠습니까? 이 서브 루틴 또는 오류에 대한 내용 - 또는 질문에 초점이 맞지 않습니다. 그것은 컴파일 될 수 있지만, 모든 경우에 호출에서 명확한 유형에 할당이 작동하지 않습니다. 인수 intent(out)
또는 (inout)
의 경우에는 가상 인수에서 실제 인수로 이동할 수 없습니다. 소스에서 재 할당하면 유형이있는 객체가 만들어 지지만 형식이 숨겨져 있습니다. 유형을 모르기 때문에 서브 루틴에서 select 유형을 사용할 수 없습니다. 또한
내가 "와 같은 유형"을 확인하거나 이런 맥락에서 뭔가 수있는 구조를 모르는 ...
답변 해 주셔서 감사합니다. 나는 그것이 표준 문제라고 생각했다. 그러나 새로운 표준 버전을 기다리는 것은 클래스 (*)를 전혀 사용하지 않는 것과 같다. 결과를 반환하지 않고 어떻게 사용할 수 있는지 모르겠다. –
Fortran에서 클래스 (*)를 반환 할 수 있습니다! 문제는 값을 설정하는 것입니다. –
할당을 사용하여 변형을 시도했습니다. 단순함을 위해 그리고 배열 크기를 검사하기를 선호하기 때문에 - 보통과 같은 구조가 가능합니다. 그러나 할당 이동 할당 할 수 있습니다 동일한 반환 ...
물론 내가 인수 형식을 확인하는 것이 좋습니다하지만 어떻게 해야할지 모르겠다, 나는 same_type_as 기억하지만 내가 원하는 것을 반환 할 수 없습니다.
당신의 예제와 C 바인딩을 사용하는 표준 부분에 대해서는 C를 모르지만 (필자는 필연적으로 그것을 지연했다 ...) 나는 그것을 고맙게 생각한다. –