| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [C++] Перевод из Фортрана в С |
| Автор: stanger 9.1.2009, 19:25 |
| Доброе время суток!! Помогите, пожалуйста! есть процедура на фортране, которую нужно перевести в си. никак не получается.. наверчено с три короба... вот текст процедуры: SUBROUTINE NLOGN(N,X,SGN) DIMENSION X(1),M(12) COMPLEX X,WK,T,Q DO 3 I=1,N 3 M(I)=2**(N-I) LX=2**N DO 10 L=1,N NMASS=2**(L-1) LMASS=LX/NMASS LBHALF=LMASS/2 K=0 DO 19 IMASS=1,NMASS FK=K FLX=LX V=SGN*6.2831853*FK V=V/FLX BR=SIN(V) AR=COS(V) WK=CMPLX(AR,BR) ISTART=LMASS*(IMASS-1) KI=LBHALF DO 5 I=1,KI J=ISTART+I JH=J+LBHALF AR=REAL(X(J)) BR=AIMAG(X(J)) X(J)=CMPLX(AR,BR) AR=REAL(X(JH)) BR=AIMAG(X(JH)) X(JH)=CMPLX(AR,BR) A1=REAL(WK) B1=AIMAG(WK) A2=A1*AR B2=B1*BR A3=A1*BR B3=AR*B1 A4=A2-B2 A5=B3+A3 Q=CMPLX(A4,A5) X(JH)=X(J)-Q X(J)=X(J)+Q 5 CONTINUE IR=0 DO 7 I=2,N II=I IF(K.LT.M(I)) GoTo 9 K=K-M(I) 7 CONTINUE 9 K=K+M(II) 19 CONTINUE 10 CONTINUE K=0 DO 15 J=1,LX IF(K.LT.J) GoTo 11 T=X(J) X(J)=X(K+1) X(K+1)=T 11 DO 13 I=1,N II=I IF(K.LT.M(I)) GoTo 155 K=K-M(I) 13 CONTINUE 155 K=K+M(II) 15 CONTINUE IF(SGN.LT.0) GoTo 35 DO 17 I=1,LX AR=REAL(X(I))/FLX BR=AIMAG(X(I))/FLX X(I)=CMPLX(AR,BR) 17 CONTINUE 35 CONTINUE RETURN END |
| Автор: Фантом 9.1.2009, 19:52 |
| А в чем проблема-то? P.S. Перелопачивать все с нуля как-то лень (и, думаю, не мне одному), поэтому лучше бы понять, в каком конкретном месте трудности. |
| Автор: nerezus 10.1.2009, 09:04 | ||
|
| Автор: stanger 10.1.2009, 12:57 |
| как я предполагаю, там проблема в индексах массива, но не уверен. скорее всего вот тут что-то не проходит, все остальное вроде норм должно быть... DO 15 J=1,LX IF(K.LT.J) GoTo 11 T=X(J) X(J)=X(K+1) X(K+1)=T 11 DO 13 I=1,N II=I IF(K.LT.M(I)) GoTo 155 K=K-M(I) 13 CONTINUE 155 K=K+M(II) 15 CONTINUE Это то, что у меня получилось.. |
| Автор: Earnest 10.1.2009, 14:50 |
| Для домашних заданий, курсовых, существует "Центр Помощи". Тема перенесена! |
| Автор: Фантом 10.1.2009, 15:35 |
| Ну, первая ошибка стандартна и очевидна. Массивы в Фортране по умолчанию нумеруются от 1. Т.е. запись DIMENSION M(12) означает, что индекс меняется от 1 до 12 включительно. Самое простое решение - если не очень жалко памяти, сделайте размеры массивов в C-варианте на единицу больше (нулевые элементы при этом использоваться не будут). |