我试图在fortran中初始化一个0到1之间等间距的数组。 我的代码是:
program test
double precision :: h
double precision, dimension(:), allocatable :: x
h = 1./11
if(.not. allocated(x)) allocate(x(10))
x(1:10) = [h:(1-h):h] (*)
end program
我给出的错误是"允许的最高数据类型等级是INTEGER(KIND = 8)"在盯着看。 我试图用
改变它x(1:10) = h:(1-h):h
x = h:(1-h):h
x(1:10) = (/(h:(1-h):h)/)
以及各种其他形式没有运气。
答案 0 :(得分:2)
您使用的语法无效Fortran,隐含的DO循环不具有非整数边界。你想要这样的东西:
x = h * real([(i,i=1,size(x))],kind(h))
有关更多信息,请查看"数组构造函数"在标准或教科书中。
不要在左侧使用(1:10)
- 请参阅https://software.intel.com/en-us/blogs/2008/03/31/doctor-it-hurts-when-i-do-this
答案 1 :(得分:0)
此表达式
[h:(1-h):h]
从Fortran的角度来看,是破碎的。它看起来有点像数组切片,但这需要整数,而不是实数,而(
和)
而不是[
和]
。它看起来有点像数组构造函数,[
和]
是正确的,但h:(1-h):h
不是。
试试这个
x = REAL([(ix,ix=1,10)],real64)/11
(已将ix
声明为整数)。表达式(ix,ix=1,10)
是隐含的do-loop ,并且在[
和]
内部生成一个数组,其中包含从1
到{{1}的整数}}。我相信其余的是显而易见的。
顺便说一下,由于我建议的替换的lhs是整个10
,你实际上并不需要明确地分配它,Fortran会自动为你做这件事。这是整个数组部分之间的差异之一,例如x
和整个数组x(1:10)
。
如果这不能产生你想要的结果,请告诉我们。