2013-06-22 5 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

Ответ Владимира Ф говорит о важной части: для (i,j) быть сложной константой константы i и j должны быть константами. Как указано там, внутренняя комплексная функция cmplx может использоваться в более общих случаях.

В целях разнообразия и предоставления опций я рассмотрю другие аспекты сложных массивов. В следующих примерах я проигнорирую выводную инструкцию и предполагаю данные.

У нас есть, то коррекция Владимира F в:

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 является элементный функция:

do i=1,3 
    indx(i,:) = CMPLX(i,[(j,j=1,3)]) 
end do 

Кроме того, мы можем рассмотреть

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. Но не ненавидите человека, просматривающего ваш код.


Это constants not constant expresssions.

Смежные вопросы