2013-06-22 2 views
3

복잡한 배열을 변수로 지정하려고합니다. 내 코드가변수 배열을 복잡한 배열에 할당

 complex indx(3,3) 
     integer i,j 

     do i=1,3 
      do j=1,3 
      indx(i,j) = (i,j)     
      write(*,*) indx(i,j) 
      end do 
     end do 

처럼이 경우 내가

A symbol must be a defined parameter in this context. [I] 
         indx(i,j) = (i,j) 

답변

5

당신은 할당 할 복잡한 값을 구축하는 기능 cmplx를 사용해야과 같은 오류를 얻고있다.

complex indx(3,3) 
    integer i,j 

    do i=1,3 
     do j=1,3 
     indx(i,j) = cmplx(i,j)    
     write(*,*) indx(i,j) 
     end do 
    end do 

시도한 구문은 상수 리터럴에만 유효합니다.

-1

블라디미르 F의 대답은 중요한 부분을 알려줍니다. (i,j)은 복잡한 리터럴 상수 인 i이고 j은 상수 여야합니다. 명시된 바와 같이, 고유 한 복합 함수 cmplx이보다 일반적인 경우에 사용될 수 있습니다.

다양성과 옵션을 제공하기 위해 복잡한 배열의 다른 측면을 살펴 보겠습니다. 다음 예제에서는 출력 문을 무시하고 주어진 선언을 가정합니다.

우리가, 다음, 블라디미르 F의 보정 :

그 꼭대기에
do i=1,3 
    indx(i,:) = CMPLX(i,[(j,j=1,3)]) 
end do 

, 우리가 고려할 수 :

do i=1,3 
    do j=1,3 
    indx(i,j) = CMPLX(i,j) ! Note that this isn't in array element order 
    end do 
end do 

우리는 cmplx원소 기능이라고하지만,주의 수

indx = RESHAPE(CMPLX([((i,i=1,3),j=1,3)],[((j,i=1,3),j=1,3)]),[3,3]) 

여기서,이 시간 t 오른쪽은 indx에 대한 배열 요소 순서입니다.

글쎄,이 마지막 (또는 심지어 두 번째)이 원래 루프보다 좋다고 말할 수는 없지만 선택 사항입니다. 어떤 경우에는 더 우아 할 수 있습니다.

하지만 다른 옵션이 있습니다. 하나의 복잡한 부분 지정자에 대한 컴파일러 지원이있는 경우 우리는 첫 번째 형태에 대한 대안이 :

do i=1,3 
    do j=1,3 
    indx(i,j)%re = i 
    indx(i,j)%im = j 
    end do 
end do 

이 정말 우리에게 아무것도 제공하지 않습니다,하지만 우리가 배열의 복잡한 부분을 가질 수 있습니다 :

do i=1,3 
    indx(i,:)%re = [(i,j=1,3)] 
    indx(i,:)%im = [(j,j=1,3)] 
end do 

또는

do i=1,3 
    indx(i,:)%re = i ! Using scalar to array assignment 
    indx(i,:)%im = [(j,j=1,3)] 
end do 

그리고 우리는

indx%re = RESHAPE([((i,i=1,3),j=1,3))],[3,3]) 
indx%im = RESHAPE([((j,i=1,3),j=1,3))],[3,3]) 
모든 길을 갈 수있다

다시 말하지만,이 모든 것은 다양성 또는 다른 애플리케이션의 이름입니다. 심지어 이들 중 일부는 spread입니다. 그러나 코드를 검토하는 사람이 싫어서는 안됩니다.


1constants not constant expresssions 있다고.

관련 문제