2017-10-11 3 views
2

현재 일부 기존 포트란 코드를 번역하고 있으며 코드의 특정 라인을 이해하는 데 어려움을 겪고 있습니다. 컴파일러는 또한이 줄이 이상하게 보이고 오류를 던집니다. 내가 이해하는 것으로부터 1을 9로 시퀀싱하고 1을 증분하여 배열을 초기화하고이 배열을 배열 주 폼으로 채워서 배열 행렬을 채우려 고합니다.Fortran에서 시퀀스가있는 배열 초기화하기

program arrayProg 

    integer :: matrix(3,3), i , j !two dimensional real array 

    matrix = reshape((/1:9:1/), (/3,3/)) 

end program arrayProg 

이 구문은 포트란에서 허용됩니까? (레거시 코드에서 가져온 것이기 때문에) 라인의 오해가 무엇입니까?

+0

컴파일러에서 어떤 종류의 오류가 발생 했습니까? 어느 컴파일러인가? [ask]와 [mcve]를 보시고, 항상 모든 정보를 제공해야합니다. 에로 메 시지는 우리에게 매우 중요합니다. 구문이 올바르지 않습니다. –

답변

4

일부 비표준 확장을 구현하지 않으면 구문이 올바르지 않으며 이러한 코드를 Fortran 컴파일러에서 컴파일 할 수 없습니다.

A colon-separated triplet (instead of an implied-DO loop) to specify a range of values and a stride; for example, the following two array constructors are equivalent: 
1  INTEGER D(3) 
2  D = (/1:5:2/)    ! Triplet form - also [1:5:2] 
3  D = (/(I, I=1, 5, 2)/)  ! implied-DO loop form 

https://software.intel.com/en-us/node/678554에서 하나가 바로 변화보다 묵시적가

(/ (i, i=1,9) /) 

같은 모양 변경을 루프을 사용하는 표준 방식으로 시퀀스를 생성하려면 :

인텔 포트란이 허용 짐작할 수 있듯이 1D 배열을 열 주요 순서로 2D 배열로 변환합니다.

+3

글을 참고하세요 : 누군가가 비표준 확장, 특히 DEC 확장 같은 추악한 것들을 새 코드에서 사용할 것을 권장 할 때마다 이런 상황을 생각해보십시오. 누군가는 코드를 상속 받고, 다른 컴파일러를 얻게 될 것이고, 적어도 혼란 스러울 것이며 코드를 표준 형식으로 다시 작성하는 PIA가 될 것입니다. "항상 인텔을 사용하기 때문에 이식성이 있습니다. 그건 말도 안됩니다"라고 말할 수는 없습니다. –

+0

동의하지만,이 경우에는 현대 Fortran이 배열 인덱스에서만 사용할 수있는 정수 시퀀스 생성을 위해 완벽하게 사용할 수있는 구문을 가지고 있다는 사실에 정말 짜증납니다. 이 방법을 사용하여 정수 시퀀스를 만들려고 시도하는 것이 자연스럽지 만, 언어 표준을 유지하기 위해 묵시적 DO 루프를 사용해야한다는 것을 알게되었습니다. (번역 : 나는 이것에 물렸습니다.) 이것이 내가 코드를 작성하는 것을 권장하는 이유입니다 결과를 사용하지 않으려는 경우에도 여러 컴파일러에서 사용할 수 있습니다. 비표준 확장 기능에 대한 빠른 알림을받을 수 있습니다. – arclight

관련 문제