另一个函数中的局部变量如何影响主函数中的变量?

柯蒂斯

所以我有一个“主”函数(SolveSixODES),它调用一个辅助函数(AllODEs)。当它这样做时,主函数中的 x 值被修改。我不明白这怎么可能,因为它不是全局变量。

这是代码,我使用的输入如下:

x=0,xmax=3,y=0-6,h=0.1,误差=0.1

Public Function SolveSixODE(x As Double, xmax As Double, Y As Range, h As Double, error As Double) 'Weird bug: You must leave the first y4 value blank

Dim i As Integer, k(7, 7) As Double, j As Integer, m As Integer                                             'k(Order #, equation #)
Dim Y5(7) As Double, Y4(7) As Double, Y4Old(7) As Double
Dim delta0(7) As Double, delta1(7) As Double, delRatio(7) As Double, Rmin As Double

For i = 1 To 6                  'Moving the input data so it can acutally be used
    Y4(i) = Y(i)
Next i

While x < xmax

    If x + h < xmax Then
        x = x + h
    Else
        h = xmax - x
        x = xmax
    End If

    For j = 1 To 6                                                          'j is the order i is equation number
        For i = 1 To 6                                                      'Calculating all of the k(1) values for eq 1 to 6
            k(j, i) = AllODES(x, Y4, i, j, k, h)    '!!!!!SOME HOW THIS LOOP MAKES X negative...!!!!!!!
        Next i
    Next j

    For i = 1 To 6
        Y4Old(i) = Y4(i)                                                    'Saving old y4 value to calc delta0
        Y4(i) = Y4(i) + h * (k(1, i) * (37 / 378) + k(3, i) * (250 / 621) + k(4, i) * (125 / 594) + k(6, i) * (512 / 1771))
        Y5(i) = Y4(i) + h * (k(1, i) * (2825 / 27648) + k(3, i) * (18575 / 48384) + k(4, i) * (13525 / 55296) + k(5, i) * (277 / 14336) + k(6, i) * (0.25))

        delta0(i) = error * (Abs(Y4Old(i)) + Abs(h * AllODES(x, Y4Old, i, 1, k, h)))  'First order because we don't want to use the k vals
        delta1(i) = Abs(Y5(i) - Y4(i))
        delRatio(i) = Abs(delta0(i) / delta1(i))                                'Ratio of errors
    Next i

    Rmin = delRatio(1)

    For i = 2 To 6
        If delRatio(i) < Rmin Then
            Rmin = delRatio(i)                                              'Determine the smallest error ratio
        End If
    Next i

    If Rmin < 1 Then                                                        'If this is true then the step size was too big must repeat step
        x = x - h                                                           'Set x and y's back to previous values
        For i = 1 To 6
            Y4(i) = Y4Old(i)
        Next i
        h = 0.9 * h * Rmin ^ 0.25                                           'adjust h value; 0.9 is a safety factor
    Else
        h = 0.9 * h * Rmin ^ 0.2                                            'Otherwise, we march on
    End If
    m = m + 1
Wend

SolveSixODE = Y4

End Function

Public Function AllODES(x As Double, Y() As Double, EqNumber As Integer, order As Integer, k() As Double, h As Double) As Double

Dim conc(7) As Double, i As Integer, j As Integer

If order = 1 Then
    x = x - h
    For i = 1 To 6                                              'Movin the data so I can use it
        conc(i) = Y(i)                                          'also adjusting the x and y values for RK4 (Cash Karp values)
    Next i

ElseIf order = 2 Then
    x = x - h + h * 0.2
    For i = 1 To 6
        conc(i) = Y(i) + h * k(1, i) * 0.2
    Next i

ElseIf order = 3 Then
    x = x - h + 0.3 * h
    For i = 1 To 6
        conc(i) = Y(i) + h * (0.075 * k(1, i) + 0.225 * k(2, i))
    Next i

ElseIf order = 4 Then
    x = x - h + 0.6 * h
    For i = 1 To 6
        conc(i) = Y(i) + h * (0.3 * k(1, i) - 0.9 * k(2, i) + 1.2 * k(3, i))
    Next i

ElseIf order = 5 Then
    x = x - h + h
    For i = 1 To 6
        conc(i) = Y(i) + h * ((-11 / 54) * k(1, i) + 2.5 * k(2, i) - (70 / 27) * k(3, i) + (35 / 27) * k(4, i))
    Next i

ElseIf order = 6 Then
    x = x - h + 0.875 * h
    For i = 1 To 6
        conc(i) = Y(i) + h * ((1631 / 55296) * k(1, i) + (175 / 512) * k(2, i) + (575 / 13824) * k(3, i) + (44275 / (110592) * k(4, i) + (253 / 4096) * k(5, i)))
    Next i
Else
    MsgBox ("error")
End If


If EqNumber = 1 Then                                            'These are the actual equations
    AllODES = x + Y(1)

ElseIf EqNumber = 2 Then
    AllODES = x

ElseIf EqNumber = 3 Then
    AllODES = Y(3)

ElseIf EqNumber = 4 Then
    AllODES = 2 * x

ElseIf EqNumber = 5 Then
    AllODES = 2 * Y(2)

ElseIf EqNumber = 6 Then
    AllODES = 3 * x

Else
    MsgBox ("You entered an Eq Number that was dumb")
End If

End Function

我可能错过了一些非常微不足道的事情,但这似乎与我对变量如何工作的了解相矛盾。因此,如果您了解在这种情况下该函数如何能够从另一个函数操作变量,我将不胜感激任何建议和/或解释!

提前致谢!

主函数中的 x 值被修改。我不明白这怎么可能,因为它不是全局变量

这是正常的,因为您x 通过引用传递函数,AllODES并且确实在那里更改了它。ByVal函数/子原型中没有明确指定关键字时默认的传递机制是ByRef,即通过引用

Public Function AllODES(x As Double, ...

方法

Public Function AllODES(ByRef x As Double, ....

我们观察到 x在这个函数中操作,所以变化会出现在调用者中。如果您希望 x 的更改不在调用者的范围内报告,请按值传递 x

Public Function AllODES(ByVal x As Double, ....
'                       ^^^^^

只有在这种情况下x,调用者的 和x被调用者的 将是两个不同的变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将一个函数中的局部变量返回给另一个函数

如何在C中的另一个函数中使用局部变量的值

在C语言中,如何评估一个函数或另一个函数中的局部变量?

在python中访问另一个模块中模块的函数的局部变量

Python Scipy是否在另一个函数中访问局部变量?

如何在python中将局部变量用于另一个函数?

从一个函数到另一个函数使用局部变量

如何通过MYSQL用户定义函数中的另一个字符串变量引用局部变量名称?

Nightwatch如何从一个函数使用局部变量到另一个函数

如何在另一个反应文件中定义局部变量

requestAnimationFrame弄乱了从另一个函数发送来的局部变量以在画布上渲染

d3(或JavaScript):在另一个函数中使用局部变量

Python:在另一个函数中使用局部变量

如何从另一个函数中的一个函数获取返回变量

在另一个类中使用局部变量的方法(在jsp页面中展示)

在辅助方法中操作局部变量并返回另一个值

在主函数的一个函数中使用局部变量

如何在一个类中的另一个函数中更新变量?

如何从Django中的另一个函数访问函数中的变量

从linux bash中的函数分配局部变量一个新值

我有一个在创建矩阵的函数中未使用的局部变量

从另一个函数访问对象中的变量

覆盖另一个函数JS中的变量

在go中从另一个函数调用变量

从python中的另一个函数调用变量

使用另一个函数中定义的变量

从另一个文件中的函数导入变量

将局部变量从函数传递给另一个 - 自动化无聊的练习

如何从另一个类中获取在一个函数中计算的变量