電子書籍の厳選無料作品が豊富!

VBで繰り返して実行するプログラムを作ったのですが、
スタック領域をオーバーしてしまいます。

再帰呼び出しになっているのはわかったのですが、
改善ができません。

簡略したら下記のような状態でした。

Sub test1()
 test2
End Sub

Sub test2()
 test1
End Sub

このtest1を実行して、繰り返し作動するようにしたのですが、
当然スタックオーバーフローになります。

簡単にループに変形できるのでしょうか?

A 回答 (4件)

DO WHILE(条件)


CALL test1()
LOOP
Sub test1()
CALL test2
End Sub
Sub test2()
処理
End sub
でよいのではないでしょうか?
    • good
    • 0
この回答へのお礼

具体的なコードありがとうございます。

基本的に教えていただいたコードの流れで構築し、
Do untilで無限ループで実行することができました。

お礼日時:2008/12/15 11:29

文系(経理など)課題では余り出てこないことなので、自信はありませんが


http://www2.cc.niigata-u.ac.jp/~takeuchi/tbasic/ …
を参考に言いますと
質問のTest2というような大雑束なプロシージャのことでなく、再帰をさせるコア処理のところに注目する必要が有ると思う。
下記は数の処理のようなことが多いので参考にしにくいかもしれないが
Function Kaijyou(n)
F = 1
For i = 1 To n
F = F * i
Next i
Kaijyou = F
End Function
ーーーー
Sub test01()
MsgBox Kaijyou(5)
End Sub
ーーーー
Function Fib(n)
If ((n = 1) Or (n = 2)) Then
Fib = 1
Else
Fib = Fib(n - 1) + Fib(n - 2)
End If
End Function
ーーーーー
Sub test02()
MsgBox Fib(8)
End Sub
ーーーーーー
Function con(n)
For i = 1 To n
con = con & i
Next i
End Function
ーーーー
Sub test03()
MsgBox con(8)
End Sub
のように
(1)処理の中で、左辺に「代入される関数名が単独で」がありと、その右辺にも「関数名を使った加工式」がある。
これによって1段階前の状態と、現在の状態がつながる。
(2)無限ループにならないよう、合理的な終了条件が処理の中に
かならず入っている。
この2条件を満たすように組めばよいと思う。
ただし上例のような1変数で数値を決める者でなく、文系の処理の場合は、どういう例なのか、何も言わないで質問者は>VBで繰り返して実行するプログラムを作ったのですが、といっていて良くわからない。
再帰にしないために下記にしてみた。
何かの参考になれば。
Public m
Public m1, m2
を使って
Function Kaijyou2(n)
For i = 1 To n
m = m * i
Next i
Kaijyou2 = m
End Function
ーーー
Sub test011()
m = 1
MsgBox Kaijyou2(6)
End Sub
ーーー
Function Fib2(n)
For i = 1 To n - 2
m = m1 + m2
m2 = m1
m1 = m
Next i
Fib2 = m
End Function
ーーー
Sub test021()
m1 = 1: m2 = 1
MsgBox Fib2(8)
End Sub
ーーー
Function con2(n)
For i = 1 To n
m = m & i
Next i
con2 = m
End Function
ーーー
Sub test031()
MsgBox con2(8)
End Sub
    • good
    • 0

スタックオーバーフローするほど再帰するのは離脱条件が間違ってて無限再帰してるんじゃないかという気がしますが。


ループに置き換えることを考えるより先にそちらをチェックしてみては?
    • good
    • 0

どのように実行したいのかを具体化しましょう


お示しのソースではTest1/Test2をどのように実行したいのかが判断できません

ある回数だけTest1/Test2を実行したい
条件が満たされるまでTest1もしくはTest2お実行したい
・・・ ある条件も提示

このTest1/Test2の他にMainループがあるのでしょうか
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!