Visual Basic и Фортран

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Visual Basic и Фортран

Сообщение KPEATOP » 28.01.2008 (Пн) 9:32

Переписываю небольшую прогу из фортрана в Visual Basic
Подскажите, кто знает, :
на фортране используется EXTERNAL P
как это перевести на Visual Basic ?
Вечность пахнет нефтью

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.01.2008 (Пн) 9:42

Хм... Забыл я фортран.
Помоему это глобальная переменная?
Тогда объяви нужную переменную в модуле, как Public.
Lasciate ogni speranza, voi ch'entrate.

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 28.01.2008 (Пн) 9:51

пробовал не получается. Впринципе там прога на фортране малюсенькая( сама программа и две функции). Может быть кто нибудь сможет перевести на Visual Basic (математические функции, циклы и условия пропускайте, чтоб время не тратить, это я сам знаю).

PROGRAM MAIN
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
DIMENSION V(20)
EXTERNAL FLAPL
N = 6
N = 1
TIME = 0.
DT = 10.

DO 10 I=1,20
TIME = TIME + DT
CALL STEFS(FLAPL,N,TIME,RESLT,V,M)
M = N
FUN = 1/DSQRT(3.1416*TIME)
PRINT 100, TIME,RESLT,FUN
10 CONTINUE
STOP
END

DOUBLE PRECISION FUNCTION FLAPL(S)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
FLAPL = 1./DSQRT(S)
RETURN
END

SUBROUTINE STEFS(P,N,T,F,V,M)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
DIMENSION G(20),H(10),V(*)
INTEGER N,M,I,K,K1,K2,NH,SN
EXTERNAL P
IF (M.NE.N) THEN
G(1) = 1.
NH = N/2
DO 10 I=1,N
G(I+1) = G(I)*I
10 CONTINUE
H(1) = 2./G(NH)
DO 20 I=2,NH
H(I) = (I**NH)*G(2*I+1)/(G(NH-I+1)*G(I+1)*G(I))
20 CONTINUE
SN = 2*(NH-(NH/2)*2)-1
DO 40 I=1,N
V(I) = 0.
K1 = (I+1)/2
K2 = MIN(I,NH)
DO 30 K=K1,K2
V(I) = V(I)+H(K)/(G(I-K+1)*G(2*K-I+1))
30 CONTINUE
V(I) = SN*V(I)
SN = -SN
40 CONTINUE
M = N
END IF
F = 0.
A = 2.
A = DLOG(A)/T
DO 50 I=1,N
F = F+V(I)*P(I*A)
50 CONTINUE
F = A*F
RETURN
END
Вечность пахнет нефтью

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.01.2008 (Пн) 10:24

Лучше просто скажи, что программа должна делать.
Если я правильно понял, то EXTERNAL означает, что аргумент должен передаваться по ссылке. В декларации функции укажи ByRef.
Но код похоже с ошибкой.
Lasciate ogni speranza, voi ch'entrate.

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 28.01.2008 (Пн) 10:37

как запустить функцию из программы ?
Я запускаю функцию STEFS, но перед ее запуском мне нужно запустить еще одну функцию FLAPL
Так правильно ?

Call STEFS(FLAPL(S), N, Time, RESLT, V, M)

Function FLAPL(ByRef S As Double)
FLAPL = 1 / Sqr(S)
End Function
Вечность пахнет нефтью

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Сообщение KPEATOP » 28.01.2008 (Пн) 11:10

в фортране

EXTERNAL FLAPL

потом вызывается STEFS

CALL STEFS(FLAPL,N,TIME,RESLT,V,M)

перед тем как пойти на STEFS идет на функцию FLAPL

DOUBLE PRECISION FUNCTION FLAPL(S)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
FLAPL = 1./DSQRT(S)
RETURN
END

а потом уже на STEFS
SUBROUTINE STEFS(P,N,T,F,V,M)

Как мне это на бейсике сделать? плиззз помогижите
Вечность пахнет нефтью

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 30.01.2008 (Ср) 8:15

FLAPL - это функция, передаваемая в другую функцию, для выполнения какой-либо работы, не связанной или расширяющей область действия алгоритма. Так ее передают в алгоритм нахождения корней математической функции.

В VB полноценной замены нет, потому что адрес функции VB может передавать в другие DLL, но сам использовать не может - нет механизма вызова такой функции.

Поэтому просто замени, убрав из списка параметров, параметр P на его реальное значение FLAPL.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 30.01.2008 (Ср) 8:32

Вот так примерно, посмотри индексы массивов.
Код: Выделить всё
Option Explicit

Sub Main()
  Dim N As Long, M As Long, I As Long
  Dim FUN As Double, RESLT As Double, Time As Double, DT As Double, V(1 To 20) As Double

  N = 6
  N = 1
  Time = 0#
  DT = 10#

  For I = 1 To 20
    Time = Time + DT
    Call STEFS(N, Time, RESLT, V, M)
    M = N
    FUN = 1 / Sqr(3.1416 * Time)
    Debug.Print Time, RESLT, FUN
  Next
 
  Stop
End Sub

Function FLAPL(ByVal S As Double) As Double
  FLAPL = 1# / Sqr(S)
End Function

Sub STEFS(ByVal N As Long, ByVal T As Double, F As Double, V() As Double, ByVal M As Long)
  Dim NH As Long, SN As Long, I As Long, K As Long, K1 As Long, K2 As Long
  Dim G(1 To 20) As Double, H(1 To 10) As Double, A As Double

  If M <> N Then
    G(1) = 1#
    NH = N / 2
    For I = 1 To N
      G(I + 1) = G(I) * I
    Next
    H(1) = 2# / G(NH)
    For I = 2 To NH
      H(I) = Exp(NH * Log(I)) * G(2 * I + 1) / (G(NH - I + 1) * G(I + 1) * G(I))
    Next
    SN = 2 * (NH - (NH / 2) * 2) - 1
    For I = 1 To N
      V(I) = 0#
      K1 = (I + 1) / 2
      K2 = IIf(I < NH, I, NH)
      For K = K1 To K2
        V(I) = V(I) + H(K) / (G(I - K + 1) * G(2 * K - I + 1))
      Next
      V(I) = SN * V(I)
      SN = -SN
    Next
    M = N
  End If
  F = 0#
  A = 2#
  A = Log(A) / T
  For I = 1 To N
    F = F + V(I) * FLAPL(I * A)
  Next
  F = A * F
End Sub

[/code]
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 111

    TopList  
cron