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

Приравнивая два массива, массивы на левой и правой сторонах должны иметь одинаковые формы. Здесь, с 1D-массивами, это просто означает, что они имеют одинаковую длину. Поскольку левая часть имеет определенную длину времени выполнения CURV_KVEC%LENGTH + 1, вы не можете использовать постоянный массив постоянной длины с правой стороны.

Если вы хотите, чтобы все элементы массива на LHS имели одинаковое значение, вы можете использовать масштабирующее устройство с правой стороны, как это было предложено @Alexander Vogt, и это значение будет передаваться в массив , Я интерпретирую код примера, что вы хотите разные значения. Если вам нужны одни и те же значения, это лучшее решение.

+0

Я, наконец, понял! Проблема была вне кода, который вы можете видеть выше. Выражения, прокомментированные в середине (! Dble (num) ... и т. Д.), Дают значение 0,5. Я прокомментировал их, чтобы проверить, есть ли там проблема. Вычисляемые значения представляют собой компоненты вектора узлов кривой NURBS, поэтому их необходимо обновлять в зависимости от степени кривой и количества контрольных точек. На самом деле в приведенном выше коде нет проблем. Существует только другой цикл снаружи, который заставляет вышеуказанный код выполняться дважды, а некоторые значения не восстанавливаются до второго цикла. Большое спасибо! – user3288183

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