(現在 過去ログ57 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 ファイル一覧 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■8779 / inTopicNo.1)  孔明の罠、か?
  
□投稿者/ 通りすがり2 -(2015/03/22(Sun) 17:42:39)
    表 "a.tbl"
    絞り込み なんたらかんたら〜1
    for &i=1,&選択件数
      表 "b.tbl"
      絞り込み なんたらかんたら〜2
      for &ii=1,&選択件数
        なにかするよ
      end
    end

    これだとループがまともに動かない
    >>ループエンドで、for文時の&選択件数の値でなくその時の値を参照しているらしい

    他の言語ならfor文解析時に初期値と終了値を確定するだろうに

    他の変数の場合はめんどいから調べていない
引用返信 [メール受信/OFF] 削除キー/
■8780 / inTopicNo.2)  Re[1]: 孔明の罠、か?
□投稿者/ 通りすがり -(2015/03/22(Sun) 18:10:47)
    これで、どうだ?

    for &i=1,&選択件数

    for &i=1,#変数( "選択件数" )
引用返信 [メール受信/OFF] 削除キー/
■8781 / inTopicNo.3)  Re[1]: 孔明の罠、か?
□投稿者/ うにん -(2015/03/23(Mon) 11:14:37)
    &選択件数でループするときは、対象行を移動しながら処理する場合が多いのでは。
    (FORでなく無条件繰り返し)

    > 他の言語ならfor文解析時に初期値と終了値を確定するだろうに

    他の言語というか、BASICですよね。
    CとかJavaなら、forが回数ループじゃなく終了条件だから構文も違っちゃうけど
引用返信 [メール受信/OFF] 削除キー/
■8783 / inTopicNo.4)  Re[1]: 孔明の罠、か?
□投稿者/ 今村 誠 -(2015/03/23(Mon) 18:24:46)
    通りすがり2さんこんにちは
    > for &i=1,&選択件数
    この場合のfor は繰り返しの増分1で&選択件数の値まで繰り返す
    という意味ですよね。
    桐では
    while (条件式 例えば &選択件数>0 等)
    end
    Loop
    cond (#総件数<1) break
    end
    なので毎回絞り込む場合あまり使わないような気がします。

引用返信 [メール受信/OFF] 削除キー/
■8784 / inTopicNo.5)  Re[1]: 孔明の罠、か?
□投稿者/ T.Samura -(2015/03/23(Mon) 18:30:50)
    絞り込みのたびに組み込み変数「&選択件数」に値が代入されるので
    外のループの終了条件が2回目以降破壊されていると思います。

    試してませんが以下のように固有変数にコピーして使えば
    期待する動作になると思います。
    内側ループでの固有変数へのコピーは冗長ですが
    イベントドリブン系統のプログラムでは他のスレッドで変更される
    可能性がある変数は値を別途保持するほうが安全と言えます。

    > 表 "a.tbl"
    > 絞り込み なんたらかんたら〜1
     代入 &j = &選択件数
     for &i=1,&j
    >   表 "b.tbl"
    >   絞り込み なんたらかんたら〜2
       代入 &jj = &選択件数
       for &ii=1,&jj
    >     なにかするよ
    >   end
    > end

引用返信 [メール受信/OFF] 削除キー/
■8785 / inTopicNo.6)  Re[1]: 孔明の罠、か?
□投稿者/ 通りすがり2 -(2015/03/23(Mon) 22:42:43)
    このスレッド自体が孔明の罠かもしれない

    >>通りすがりさん
    こういうレスはいい。実にエレガントでない答え。でも、しっかり解決している<これ、大事

    >>うにんさん
    Pascalとか、初期値・終了値でループ系は色々ありますよ

    >>T.Samuraさん
    桐システムが随時変数を参照するなら別変数を使うしかない

    命題は、桐の言語設計がおかしいか、バグじゃないか?という点です

    >>今村 誠さん
    まさに、あまり使わない方法だから10年以上気付かなかった
    だから、罠

    言語システムを設計する場合、終了値=計算式なら値参照でないといけない

    一応解決チェックしておきます

解決済み!
引用返信 [メール受信/OFF] 削除キー/
■8786 / inTopicNo.7)  Re[2]: 孔明の罠、か?
□投稿者/ うにん -(2015/03/23(Mon) 23:55:54)
    > このスレッド自体が孔明の罠かもしれない

    だはは。

    > >>うにんさん
    > Pascalとか、初期値・終了値でループ系は色々ありますよ

    久しく使ってないのでもう忘れてました。

    > 命題は、桐の言語設計がおかしいか、バグじゃないか?という点です

    他の言語と違うからといって、おかしいとかバグだということはないと思うけど、確かに罠ではありますね。

    改めてヘルプを読んでみると、ちゃんと書いてある。

    ><開始値>が<終了値>を超えるまで、[繰り返し]コマンドから[繰り返し終了]コマンドまでのコマンドを、繰り返し実行します。

    繰り返しコマンド自体が繰り返される範囲に入ってる。

    >繰り返しを開始した直後、<変数名>には<開始値>が代入されます。以降、[繰り返し終了]コマンドまでの処理が1回繰り返されるたびに<加算値>が加えられます。

    <終了値>に関しては(開始直後に計算するとも)特に書いてない。

    ><変数名>の値が<終了値>を超えると、[繰り返し終了]コマンドのつぎの行に制御が移ります。

    超えるかどうか調べるのは繰り返しコマンドの行だろうから、その時に<終了値>=計算式が計算される。
    (最初から超えてたら1回も実行されないから、繰り返し終了コマンドではない)

    ちなみに、<加算値>も毎回計算されてますよね。

    前に書いたように、いつも
    絞り込み
    繰り返し (.not #EOF)
     *処理
     ジャンプ 次行
    繰り返し終了
    みたいにやってたので、気づきませんでした。
引用返信 [メール受信/OFF] 削除キー/
■8787 / inTopicNo.8)  Re[3]: 孔明の罠、か?
□投稿者/ 通りすがり2 -(2015/03/25(Wed) 11:47:49)
    2015/03/25(Wed) 11:51:58 編集(投稿者)

    > <終了値>に関しては(開始直後に計算するとも)特に書いてない。

    上の通りすがりさんの#変数()関数を使用する方法だとうまくいきます

    つまり、終了値判定は最初に一回だけだと考えられます
    毎回判定なら、#変数()関数を使ってもうまくいくはずがありません
    値情報でなく値の場所をスタックしていると思います

    lisp系なら、これでいいのかな?

    しかし、Algol系構造化文の流れですから、これを仕様で逃げるのは無理だろうと思います
引用返信 [メール受信/OFF] 削除キー/
■8788 / inTopicNo.9)  Re[4]: 孔明の罠、か?
□投稿者/ うにん -(2015/03/25(Wed) 13:37:02)
    > 上の通りすがりさんの#変数()関数を使用する方法だとうまくいきます
    >
    > つまり、終了値判定は最初に一回だけだと考えられます
    > 毎回判定なら、#変数()関数を使ってもうまくいくはずがありません

    あれ?

    考えてもわからないことを考える罠にはまってしまったか...

    For &実行リターン=#SETQ(&合計値,#sec(#TIME)),&合計値+1,1
     確認 #STR(&実行リターン)
    End

    現在時刻の秒を&合計値に代入して、それ+1までループする
    だから、1回実行して終わりのはずだけど、そうはならない。
    なんでだろ〜?

引用返信 [メール受信/OFF] 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/

HOME HELP 新規作成 新着記事 トピック表示 ファイル一覧 検索 過去ログ

- Child Tree -
- Antispam Version -