2014-02-08 38 views
1

我试图实现与代码的最后一行获得的相同目标,但是可以在代码中看到do循环。问题是,当我尝试形成与命令循环像数组表达式的形状不符合Fortran 90

CURV_KVEC%KNOTS(knot)=(/0.d0/) 

我得到一个错误

The shapes of the array expressions do not conform. 

任何帮助将不胜感激!谢谢。

cdegree=2 
count=5 

do knot=0,cdegree+count 
if (knot.le.cdegree) then 
    CURV_KVEC%KNOTS(knot)=0.d0 
    test(knot+1)=0.d0 
elseif (knot.ge.count) then 
    test(knot+1)=1.d0 
    CURV_KVEC%KNOTS(knot)=1.d0 
elseif(nvec.eq.0) then 
    num=num+1 
    do kn=1,cdegree 
     CURV_KVEC%KNOTS(knot+kn-1)=0.5d0 !dble(num)/(dble(count-cdegree-1)/dble(cdegree)+1.d0) 
     test(knot+kn)=0.5d0 !dble(num)/(dble(count-cdegree-1)/dble(cdegree)+1.d0) 
     nvec=cdegree-1 
    enddo 
elseif(nvec.ne.0) then 
    nvec=nvec-1 
endif 
write(14,*)knot,num,nvec,test(knot+1) 
enddo  

! CURV_KVEC%KNOTS(0:CURV_KVEC%LENGTH) = (/0.D0,0.D0,0.D0,0.5d0,0.5d0,1.d0,1.d0,1.d0/) 

回答

1

CURV_KVEC%KNOTS(knot)是一个数组元素,一个标量。 (/0.d0/)表示长度为1的阵列,这些都是不一样的东西......

简单地写

CURV_KVEC%KNOTS(knot) = 0.d0 

会做的伎俩。

+0

除了在代码示例中注释掉的行有各种值,并非全部为零。所以这个解决方案是不相同的。 –

+0

我终于明白了!问题出在上面可以看到的代码之外。在中间注释的表达式(!dble(num)...等等)给出0.5的值。我评论他们,以检查是否有问题。计算的值是NURBS曲线的结矢量的分量,因此需要根据曲线的度数和控制点的数量进行更新。其实在上面的代码中没有问题。外面只有另一个循环,导致上面的代码被执行两次,有些值在第二次循环之前没有被恢复。非常感谢! – user3288183

0

等同于两个数组,左右两侧的数组必须具有相同的形状。在这里,一维数组只是意味着它们具有相同的长度。由于左侧的运行时间长度为CURV_KVEC%LENGTH + 1,所以不能在右侧使用固定长度的常量数组。

如果您希望LHS上的数组的所有元素具有相同的值,那么您可以按照@Alexander Vogt的建议在右侧使用缩放器,并将该值广播到阵列。我正在将示例代码解释为您需要不同的值。如果你想要相同的值,这是最好的解决方案。

+0

我终于明白了!问题出在上面可以看到的代码之外。在中间注释的表达式(!dble(num)...等等)给出0.5的值。我评论他们,以检查是否有问题。计算的值是NURBS曲线的结矢量的分量,因此需要根据曲线的度数和控制点的数量进行更新。其实在上面的代码中没有问题。外面只有另一个循环,导致上面的代码被执行两次,有些值在第二次循环之前没有被恢复。非常感谢! – user3288183