新しく発言する EXIT インデックスへ
CHAINでのループ

  CHAINでのループ 唐瀬人 2006/08/12 02:39:58 
  CHAIN文を実行すると,実行先と実行元の双方... 白石 和夫 2006/08/12 09:09:58 
   └ご回答有難うございます。 唐瀬人 2006/08/12 09:52:43 
    └繰り返しが目的であれば,A,Bを外部副プログ... 白石 和夫 2006/08/12 10:22:53 
     ├どうしても別ファイルに分けないといけない... 白石 和夫 2006/08/12 10:28:13 
     └DECLAREEXTERNALSUBA 白石 和夫 2006/08/12 11:02:01 
      └先にあげたプログラムA、B、C、Dはどれ... 唐瀬人 2006/08/12 13:26:35 
       └カスタマイズすべき部分はMERGE命令で読み込... 白石 和夫 2006/08/12 17:53:16 
        └A.BASの中身は 白石 和夫 2006/08/12 17:56:05 
         └FUCTIONではなくてFUNCTIONです。 白石 和夫 2006/08/12 18:12:25 
          └説明がうまくなかったかもしれませんが、基... 唐瀬人 2006/08/12 19:51:07 
           └とりあえず,次バージョンでは,すでに開い... 白石 和夫 2006/08/13 10:03:00 
            └既存ウィンドウ上のプログラムを使うことに... 白石 和夫 2006/08/13 14:06:16 
             └メインウィンドウが10個以上の子ウィンドウ... 白石 和夫 2006/08/13 14:23:46 
              ├ご対応いただき有難うございます。 唐瀬人 2006/08/14 01:57:11 
              └ver5.9.3で早速動作テストしたところ、CHAI... 唐瀬人 2006/08/14 18:00:15 

  CHAINでのループ 唐瀬人 2006/08/12 02:39:58  ツリーへ

CHAINでのループ 返事を書く
唐瀬人 2006/08/12 02:39:58
いつもお世話になります。

早速ですが、原因が解らない現象があるのでお聞きしたいと思います。

A、B、C、Dの4つのプログラムがあり、AとBをCHAIN文で結んでループさせての処理と、CとDを同様にCHAIN文で結んでループさせての処理を同時に行わせると、しばらくはこちらの意図するように動くのですが、いつしかエラーも出さず勝手にプログラムが終了してしまう現象が見られます。A−BループあるいはC−Dループの片方だけ終了する時もあれば、両方の時もあります。プログラムの中にはESCキー入力を拾って終了させる構文GetKeyState(27)がありますが、これを押すこと無しに起きますし、擬似入力があった場合出力するように細工してみても何もありません。

通常関連づけ起動でエディタ画面を出さずにやっているのですが、BASICを先に立ち上げて同様の事を試してもやはり起こります。この際画面内はCHAINで繰り返した分だけウインドウが開いてしまいます。

CHAIN文で繋ぐ回数には制限があるのでしょうか?それとも何か他に原因があるのでしょうか?

  CHAIN文を実行すると,実行先と実行元の双方... 白石 和夫 2006/08/12 09:09:58  ツリーへ

Re: CHAINでのループ 返事を書く
白石 和夫 2006/08/12 09:09:58
CHAIN文を実行すると,実行先と実行元の双方のウィンドウが残ります。
ループを作ってしまうと大量のウインドウができることになるので,それが原因で動作異常を起こすかも知れません。
CHAINを
EXECUTE NOWAIT
に変えるとどうなりますか?
なお,その際,CHAIN文の次の文がEND文でない場合は,STOP文を追加してください。

   └ご回答有難うございます。 唐瀬人 2006/08/12 09:52:43  ツリーへ

Re: CHAIN文を実行すると,実行先と実行元の双方... 返事を書く
唐瀬人 2006/08/12 09:52:43
ご回答有難うございます。

EXECUTE NOWAITに置き換えてやってみると先に挙げた問題はなくなるのですが、繋ぐプログラムが実行される度にBASICシステムを起動するのでCHAIN文に比較して処理時間が相当遅くなってしまい許容範疇を超えてしまいます。関連づけ起動の場合は画面が常にちらつきますし、画面下部ではアイコンがせわしなく出たり消えたりを繰返すので余り快適でない状況になってしまいます。

そもそもEXECUTEでなくCHAINで繋ぐようにしたのはこれら動作時間と画面安定を踏まえてなのですが、途中で終了してしまうようだとうまくありません。CHAINでうまく動いているうちは処理は快適なのですが、同等の動作を維持しながらプログラムを繋ぎ続けられるうまい方法はないでしょうか?もちろんCHAIN文にはこだわりませんが。

    └繰り返しが目的であれば,A,Bを外部副プログ... 白石 和夫 2006/08/12 10:22:53  ツリーへ

Re: ご回答有難うございます。 返事を書く
白石 和夫 2006/08/12 10:22:53
繰り返しが目的であれば,A,Bを外部副プログラムにして
DECLARE EXTERNAL SUB A,B
DO
CALL A
CALL B
LOOP
END
EXTERNAL SUB A
・・・・
END SUB
EXTERNAL SUB B
・・・・
END SUB
みたいにするのが自然なのですが,
何かCHAIN文にしないと都合の悪いことがあるのでしょうか?

     ├どうしても別ファイルに分けないといけない... 白石 和夫 2006/08/12 10:28:13  ツリーへ

Re: 繰り返しが目的であれば,A,Bを外部副プログ... 返事を書く
白石 和夫 2006/08/12 10:28:13
どうしても別ファイルに分けないといけないのなら,
CHAINが無限連鎖にならないように,
たとえば,AからBにつなぐときはCHAIN,
BからAにつなぐときはEXECUTE NOWAIT
みたいにしてみてはいかがでしょうか。

     └DECLAREEXTERNALSUBA 白石 和夫 2006/08/12 11:02:01  ツリーへ

Re: 繰り返しが目的であれば,A,Bを外部副プログ... 返事を書く
白石 和夫 2006/08/12 11:02:01
DECLARE EXTERNAL SUB A
DO
CALL A
LOOP
END
EXTERNAL SUB A
DECLARE EXTERNAL SUB b
・・・・
CALL B
END SUB
EXTERNAL SUB B
・・・・
END SUB
みたいにしても大丈夫です。

しかし,

DECLARE EXTERNAL SUB a
CALL A
END
EXTERNAL SUB a
DECLARE EXTERNAL SUB b
・・・・・
CALL b
END SUB
EXTERNAL SUB b
DECLARE EXTERNAL SUB a
・・・・・
CALL a
END sub
のようにすると,何回かの繰り返しの後,スタックオーバーフローのエラーで止まります。

      └先にあげたプログラムA、B、C、Dはどれ... 唐瀬人 2006/08/12 13:26:35  ツリーへ

Re: DECLAREEXTERNALSUBA 返事を書く
唐瀬人 2006/08/12 13:26:35
先にあげたプログラムA、B、C、Dはどれも基本構造は同じで、ユーザーが指定されたパラメータの設定を変えて使用するものです。ユーザーはAの処理をした後にどういう処理をさせるかは連係させるプログラムファイルを指定することで決まるようにしています。このときBのBASICプログラムファイルを指定してさらにBでAのプログラムに連係するように指定するとA−Bループになりますし、場合によってはCのプログラムファイルを実行して終わらせる指定をしたいかもしれません。また終了時に連係させるのは必ずしもBASICファイルとは限らずテキストファイルを開いたり他のアプリケーションの実行ファイルを開きたい場合も想定されます。

こういったユーザーによるカスタマイズ的な使用をさせたい場合に、ファイル名の指定だけですむ簡易性やその種類を選ばない汎用性、また動作スピードといった点において現状CHAIN文は大変重宝しています。これを用いることで計算処理の用途に留まらず様々な拡張が容易に可能になっているところもあって、繰返し制限という理由だけでこの機能を使えなくなってしまうのは惜しい気がします。どうしてもだめならご提案のように何回かに一回EXCUTEを挟むような対策を講じなくてはならないのでしょうが、スピードやシンプルさの面で難が出てきそうな気がします。

       └カスタマイズすべき部分はMERGE命令で読み込... 白石 和夫 2006/08/12 17:53:16  ツリーへ

Re: 先にあげたプログラムA、B、C、Dはどれ... 返事を書く
白石 和夫 2006/08/12 17:53:16
カスタマイズすべき部分はMERGE命令で読み込んで実行する構造にしておき,たとえば,A,B,Cを,次に実行する手続き名を返す外部関数として定義することはできませんか。

DECLARE EXTERNAL FUNCTION A$,B$,C$
LET s$="A"
DO
SELECT CASE s$
CASE "A"
LET s$=A$
CASE "B"
LET s$=B$
CASE "C"
LET s$=C$
CASE ELSE

END SELECT
LOOP
END
MERGE "A.BAS"
MERGE "B.BAS"
MERGE "C.BAS"

        └A.BASの中身は 白石 和夫 2006/08/12 17:56:05  ツリーへ

Re: カスタマイズすべき部分はMERGE命令で読み込... 返事を書く
白石 和夫 2006/08/12 17:56:05
A.BASの中身は
EXTERNAL FUCTION A$
 Aの処理
LET A$="B" ! この部分をカスタマイズする
! LET A$="C" ! この部分をカスタマイズする
END FUCTION

         └FUCTIONではなくてFUNCTIONです。 白石 和夫 2006/08/12 18:12:25  ツリーへ

Re: A.BASの中身は 返事を書く
白石 和夫 2006/08/12 18:12:25
FUCTIONではなくてFUNCTIONです。
外部関数ではなくて,外部副プログラムとして定義して,s$をその引数として情報を渡す構造にすることもできます。

          └説明がうまくなかったかもしれませんが、基... 唐瀬人 2006/08/12 19:51:07  ツリーへ

Re: FUCTIONではなくてFUNCTIONです。 返事を書く
唐瀬人 2006/08/12 19:51:07
説明がうまくなかったかもしれませんが、基本となるプログラムを「A」とするならば、ユーザーがこの構文をいじることなくパラメータ(ファイル名以外は数値か記号の選択)のみを変えることでB、C、Dに限らず様々なパターンの処理ブロックを作り、これらを単体はもちろん、直列・並列に任意に組み合わせて目的の制御ができるような基本ブロック「A」を作りたいということです。(というか、もう完成して配布もしているのですが、恥ずかしながら今頃になってCHAINの問題が判明したわけです。)

ご提案いただいたようなナビプログラムにMERGEでプログラムをくっつけて実行していく方法もあると思いますが、それだとだいぶん自分のやりたいイメージと違ってしまいます。勝手ですみません(笑)。

           └とりあえず,次バージョンでは,すでに開い... 白石 和夫 2006/08/13 10:03:00  ツリーへ

Re: 説明がうまくなかったかもしれませんが、基... 返事を書く
白石 和夫 2006/08/13 10:03:00
とりあえず,次バージョンでは,すでに開いたウィンドウがある場合はそれを再利用するように変更してみます。
完全な無限ループは不可能ですが,かなりの回数の繰り返しには耐えられるようになると思います。

            └既存ウィンドウ上のプログラムを使うことに... 白石 和夫 2006/08/13 14:06:16  ツリーへ

Re: とりあえず,次バージョンでは,すでに開い... 返事を書く
白石 和夫 2006/08/13 14:06:16
既存ウィンドウ上のプログラムを使うことにすると,プログラムを書き出して実行する手法が使えないことになるので,この計画はキャンセルします。

             └メインウィンドウが10個以上の子ウィンドウ... 白石 和夫 2006/08/13 14:23:46  ツリーへ

Re: 既存ウィンドウ上のプログラムを使うことに... 返事を書く
白石 和夫 2006/08/13 14:23:46
メインウィンドウが10個以上の子ウィンドウを持っていたら,CHAIN元のウィンドウは閉じることにします。

              ├ご対応いただき有難うございます。 唐瀬人 2006/08/14 01:57:11  ツリーへ

Re: メインウィンドウが10個以上の子ウィンドウ... 返事を書く
唐瀬人 2006/08/14 01:57:11
ご対応いただき有難うございます。
それなら現状の命令でも動き続けられそうですね。

素人考えで恐縮ですが、CHAIN命令に既存ウインドウで実行させるようなパラメータをつけられるようにしたらダメですかね?
例えば CHAIN "A.BAS" SW とか(SWは SAME WINDOW のつもり)。
稚拙で本当すみません(笑)。



              └ver5.9.3で早速動作テストしたところ、CHAI... 唐瀬人 2006/08/14 18:00:15  ツリーへ

Re: メインウィンドウが10個以上の子ウィンドウ... 返事を書く
唐瀬人 2006/08/14 18:00:15
ver 5.9.3 で早速動作テストしたところ、CHAINループが問題なく継続できるようになりました。関連づけ起動でも問題ありません。

早々に対応いただき有難うございました。


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。