2

私には次の3つの機能があります。

最初の2つの関数を実行すると問題はありませんが、最後の関数(LMTD)を実行すると、「ゼロ除算」と表示されますが、デバッグ時に値がある引数とない引数があります。私は自分が何をしなければならないかを知っていますが、それは私には意味がないので、なぜ私がそれをしなければならないのか知りたいです。

Tinn-functionにはTutの引数がないので、Tinn-functionの引数に追加する必要があります。同じことがTutにも当てはまります。これは、Tinnのすべての引数を知っているわけではなく、LMTDにはTinnとTutの両方の引数が必要です。そうすれば、すべてがスムーズに実行されます。なぜ私はこれをしなければならないのですか?

Public Function Tinn(Tw, Qw, Qp, Q, deltaT)

Tinn = (((Tw * Qw) + (Tut(Q, fd, mix) * Q)) / Qp) + deltaT

End Function

Public Function Tut(Q, fd, mix)

Tut = Tinn(Tw, Qw, Qp, Q, deltaT) _
    - (avgittEffektAiUiLMTD() / ((Q * fd * mix) / 3600))

End Function

Public Function LMTD(Tsjo)

LMTD = ((Tinn(Tw, Qw, Qp, Q, deltaT) - Tsjo) - (Tut(Q, fd, mix) - Tsjo)) _
    / (WorksheetFunction.Ln((Tinn(Tw, Qw, Qp, Q, deltaT) - Tsjo) _
       / (Tut(Q, fd, mix) - Tsjo)))

End Function
4

1 に答える 1

5

引数がどのように渡されるかについて、便利で完全な説明をしようと思います。

私が知る限り、LMTD は他の関数を呼び出すメイン関数です。新しい関数が呼び出されるたびに、「スタック」と呼ばれるものの上に配置されます。
スタックの原則には、メモリの一方の端 (スタックの最上位) でメモリが割り当てられ、割り当てが解除されることが含まれます。これらのローカル変数は、関数がスコープ外になるとすぐに解放されます (値が返されるとき)。一般に「後入れ先出し」(LIFO)と呼ばれるもの。
したがって、LMTD をベース (別のサブルーチンまたは関数によって呼び出される必要があるため、おそらく最終的なベースではない) と見なす場合、Tinn と Tut は、これらの関数が呼び出されるたびにスタックの一番上に配置されます。

ただし(そしてここがポイントです)、
関数でローカルに宣言されず、引数として渡される変数は、参照によって渡される標準です。それらは、関数(またはサブ)によって送信された引数のメモリアドレスを含むポインター変数です。スタック。関数が参照によってパラメータを取る場合 (デフォルト)、渡されるメモリ アドレスに含まれる値を変更できるため、呼び出された関数が返されるときに元の変数値を変更できます。

次の例はそれを示しています。

Sub Base_Sub()

Dim i as single
Dim c as single
Dim d as single

c = 5
d = 6

i = Function_1(c, d)

End Sub

Function Function_1(c, d)

c = 7 'Notice that the variables c and d are also changed in the Base_sub
d = 5 

Function_1 = c + d

End Function

反対に、変数を値 (byVal キーワード) で送信する場合、これは元の変数 (引数として渡される) のコピーが作成され、コピーが関数内で操作されている間、元の変数は変更されないことを意味します。 . つまり、このコピーはスタックの一番上のローカル変数になり、関数がスコープ外になるとすぐに解放されます。

したがって、コードを深く掘り下げることなく、1 つのルーチンで多くの関数を呼び出す場合は、さまざまなレイヤーのこの一般的な概念を念頭に置いておくと役立つ場合があります。ローカル変数を監視するには、VBA の「ローカル」ウィンドウを使用してフォローアップするか、debug.print を使用して即時ウィンドウでフォローアップします。エラーに関する透明性を高めるのに役立つのは、チェックを実行することです。たとえば、Tinn 関数の場合:

If QP = 0 then 
    'Notify problem at QP. 
end if

私の説明が予想以上だったら申し訳ありませんが、私はこれについてできるだけ完全にしようとしました.

于 2012-07-05T09:14:05.943 に答える