2014-02-08 62 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