我想将复数数组指定为变量。 我的代码就像
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)
答案 0 :(得分:6)
您必须使用函数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 :(得分:-1)
弗拉基米尔F的回答说明了重要的部分:因为(i,j)
是一个复杂的文字常量i
而j
必须是常数。 1 如上所述在那里,内在的复杂函数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])
此时右侧是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
。但不要讨厌审核你的代码的人。