Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: как передать функцию в качестве параметра? Добавлено: 16.05.07 20:45  

Автор вопроса:  Floyd
подскажите, есть ли реализация в VB этого вопроса?
есть процедура подсчета интегралов. эта процедура считает
интеграл ессно по численному методу. в нее нужно передать извне
вид функции, которую обсчитывать. спасибо!

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 16.05.07 20:59
Через CallByName().

Ответить

Номер ответа: 2
Автор ответа:
 Floyd



Вопросов: 6
Ответов: 12
 Профиль | | #2 Добавлено: 16.05.07 21:30
а можно чуть подробнее? я не могу чё-то разобраться как лучше сделать.

вот кусок кода. процедура счета интеграла:

Private Sub Integral(a, b, f)
    Dim i, n As Integer
    Dim chet, nechet, delta, Result As Double
    n = 10 'tochnost
    If n Mod 2 <> 0 Then n = n - 1
    delta = (b - a) / n
    chet = 0
    nechet = 0
    For i = 1 To n - 1
        If i Mod 2 = 0 Then
            chet = chet + (f(a + (delta * i)))
                     Else
            nechet = nechet + (f(a + (delta * i)))
        End If
    Next i
Result = (delta / 3) * (f(a) + f(b) + (2 * chet) + (4 * nechet))
'MsgBox result, vbInformation, "Результат"
End Sub

как видно, в нее передается граница a, граница b,
и надо передать вид функции f.
сейчас функция определяется, как

Function f(x) As Double
    f = x*x + 3*x
End Function

и т.к. она глобальная, процедура ее знает без передачи.
как сделать, чтобы можно было вызывать счет интеграла в такой форме:

Function func(x) As Double
    func = x*x + 3*x
End Function
...
Call Integral(0, 5, func)

или еще лучше

func(x) = x*x + 3*x
Call Integral(0, 5, func)


спасибо!

Ответить

Номер ответа: 3
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #3 Добавлено: 16.05.07 23:50

Option Explicit
Private Declare Function Signatura Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal prm1 As Long, ByVal prm2 As Long, ByVal prm3 As Long, ByVal prm4 As Long) As Long
Private Sub Proba()
Dim adr As Long
adr = GetFncAdr(AddressOf func)
Signatura adr, 55, 0, 0, 0
End Sub
Private Function GetFncAdr(adr As Long) As Long
    GetFncAdr = adr
End Function
'в модуле
Public Function func(ByVal x As Long, ByVal dumm2 As Long, ByVal dumm3 As Long, ByVal dumm4 As Long) As Double
func = x * x + 3 * x
End Function


Приблизительно так

Ответить

Номер ответа: 4
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #4 Добавлено: 17.05.07 01:56
еще где-то натыкался на хороший пример с Get / PutMem1 (2,4,8)
Private Declare Sub GetMem1 Lib "msvbvm60" (ByVal Addr As Long, RetVal As Byte)
Private Declare Sub PutMem2 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Integer)

попробуй поискать

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам