SRC質問掲示板Mk2
(現在 過去ログ79 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

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

■14723 / inTopicNo.1)  文字列算出でフリーズしてしまう
  
□投稿者/ ドラモンスター -(2004/07/28(Wed) 21:31:31) [ID:57T32sOL]
http://www5f.biglobe.ne.jp/~dramonster/index.html
    私はドラモンスターです。

    ↓イベントデータここから

    For 文字パーツ番号 = 1 To 8
    Switch 文字パーツ番号
    Case 1
    文字パーツ[文字パーツ番号] = Call("判定名$(Wide(文字パーツ番号))文字目選定")
    Case 2 3
    Do
    Do
    Do
    文字パーツ[文字パーツ番号] = Call("判定名$(Wide(文字パーツ番号))文字目選定")
    Loop While (文字パーツ[文字パーツ番号] = Call(子音算出,Right(文字パーツ[(文字パーツ番号 - 1)],1)))
    #↑算出した文字が直前に算出した文字列の最後の文字の子音ではないかどうかをサブルーチン「子音算出」を使って調査し、同じであれば算出をやり直す。
    Loop While (InStr(文字パーツ[(文字パーツ番号 - 1)],文字パーツ[文字パーツ番号]) <> 0)
    #↑算出した文字が直前に算出した文字列の中にないかどうかを調査し、入っていれば算出をやり直す。
    Loop While (Call(拗音判定,文字パーツ[文字パーツ番号]) = Call(拗音判定,文字パーツ[(文字パーツ番号 - 1)]))
    #↑算出した文字と直前に算出した文字列が共に拗音であるかをサブルーチン「拗音判定」を使って調査し、共に拗音であった場合は算出をやり直す。
    Case 4
    Switch Random(4)
    Case 1
    文字パーツ[文字パーツ番号] = ー
    If Random(100) <= 50 Then
    For 残り文字列 = (文字パーツ番号 + 1) To 8
    文字パーツ[残り文字列] = ""
    Next
    Break
    EndIf
    #↑50%の確率で残りの文字列に空文字列を代入して処理を終了する。
    Case 2
    文字パーツ[文字パーツ番号] = ン
    If Random(100) <= 50 Then
    For 残り文字列 = (文字パーツ番号 + 1) To 8
    文字パーツ[残り文字列] = ""
    Next
    Break
    EndIf
    #↑50%の確率で残りの文字列に空文字列を代入して処理を終了する。
    Case 3
    文字パーツ[文字パーツ番号] = ッ
    Case 4
    文字パーツ[文字パーツ番号] = ""
    EndSw
    Case 5
    Switch 文字パーツ[4]
    Case ッ
    Do
    Do
    Do
    文字パーツ[文字パーツ番号] = Call("判定名$(Wide(文字パーツ番号))文字目選定第1処理")
    Loop While (文字パーツ[文字パーツ番号] = Call(子音算出,Right(文字パーツ[(文字パーツ番号 - 2)],1)))
    #↑算出した文字が直前に算出した文字列の最後の文字の子音ではないかどうかをサブルーチン「子音算出」を使って調査し、同じであれば算出をやり直す。
    Loop While (InStr(文字パーツ[(文字パーツ番号 - 2)],文字パーツ[文字パーツ番号]) <> 0)
    #↑算出した文字が直前に算出した文字列の中にないかどうかを調査し、入っていれば算出をやり直す。
    Loop While (Call(拗音判定,文字パーツ[文字パーツ番号]) = Call(拗音判定,文字パーツ[(文字パーツ番号 - 2)]))
    #↑算出した文字と直前に算出した文字列が共に拗音であるかをサブルーチン「拗音判定」を使って調査し、共に拗音であった場合は算出をやり直す。
    Switch 文字パーツ[文字パーツ番号]
    Case ン ス
    If Random(100) <= 50 Then
    For 残り文字列 = (文字パーツ番号 + 1) To 8
    文字パーツ[残り文字列] = ""
    Next
    Break
    EndIf
    #↑50%の確率で残りの文字列に空文字列を代入して処理を終了する。
    EndSw
    Case Else
    Do
    Do
    Do
    文字パーツ[文字パーツ番号] = Call("判定名$(Wide(文字パーツ番号))文字目選定第2処理")
    Loop While (文字パーツ[文字パーツ番号] = Call(子音算出,Right(文字パーツ[(文字パーツ番号 - 2)],1)))
    #↑算出した文字が直前に算出した文字列の最後の文字の子音ではないかどうかをサブルーチン「子音算出」を使って調査し、同じであれば算出をやり直す。
    Loop While (InStr(文字パーツ[(文字パーツ番号 - 2)],文字パーツ[文字パーツ番号]) <> 0)
    #↑算出した文字が直前に算出した文字列の中にないかどうかを調査し、入っていれば算出をやり直す。
    Loop While (Call(拗音判定,文字パーツ[文字パーツ番号]) = Call(拗音判定,文字パーツ[(文字パーツ番号 - 2)]))
    #↑算出した文字と直前に算出した文字列が共に拗音であるかをサブルーチン「拗音判定」を使って調査し、共に拗音であった場合は算出をやり直す。
    Switch 文字パーツ[文字パーツ番号]
    Case ン ス
    If Random(100) <= 50 Then
    For 残り文字列 = (文字パーツ番号 + 1) To 8
    文字パーツ[残り文字列] = ""
    Next
    Break
    EndIf
    #↑50%の確率で残りの文字列に空文字列を代入して処理を終了する。
    EndSw
    EndSw
    Case 6
    Do
    Do
    Do
    文字パーツ[文字パーツ番号] = Call("判定名$(Wide(文字パーツ番号))文字目選定")
    Loop While (文字パーツ[文字パーツ番号] = Call(子音算出,Right(文字パーツ[(文字パーツ番号 - 1)],1)))
    #↑算出した文字が直前に算出した文字列の最後の文字の子音ではないかどうかをサブルーチン「子音算出」を使って調査し、同じであれば算出をやり直す。
    Loop While (InStr(文字パーツ[(文字パーツ番号 - 1)],文字パーツ[文字パーツ番号]) <> 0)
    #↑算出した文字が直前に算出した文字列の中にないかどうかを調査し、入っていれば算出をやり直す。
    Loop While (Call(拗音判定,文字パーツ[文字パーツ番号]) = Call(拗音判定,文字パーツ[(文字パーツ番号 - 1)]))
    #↑算出した文字と直前に算出した文字列が共に拗音であるかをサブルーチン「拗音判定」を使って調査し、共に拗音であった場合は算出をやり直す。
    If 文字パーツ[(文字パーツ番号 - 1)] = エ Then
    If 文字パーツ[文字パーツ番号] = ル Then
    Break
    EndIf
    EndIf
    Switch 文字パーツ[文字パーツ番号]
    Case ン ス ー ル
    If Random(100) <= 50 Then
    For 残り文字列 = (文字パーツ番号 + 1) To 8
    文字パーツ[残り文字列] = ""
    Next
    Break
    EndIf
    #↑50%の確率で残りの文字列に空文字列を代入して処理を終了する。
    EndSw
    Case 7
    Do
    Do
    文字パーツ[文字パーツ番号] = Call("判定名$(Wide(文字パーツ番号))文字目選定")
    Loop While (文字パーツ[文字パーツ番号] = Call(子音算出,Right(文字パーツ[(文字パーツ番号 - 1)],1)))
    #↑算出した文字が直前に算出した文字列の最後の文字の子音ではないかどうかをサブルーチン「子音算出」を使って調査し、同じであれば算出をやり直す。
    Loop While (InStr(文字パーツ[(文字パーツ番号 - 1)],文字パーツ[文字パーツ番号]) <> 0)
    #↑算出した文字が直前に算出した文字列の中にないかどうかを調査し、入っていれば算出をやり直す。
    Switch 文字パーツ[文字パーツ番号]
    #↑算出した文字と直前に算出した文字列が共に拗音であるかをサブルーチン「拗音判定」を使って調査し、共に拗音であった場合は算出をやり直す。
    Case ン ス ル ー ア
    For 残り文字列 = (文字パーツ番号 + 1) To 8
    文字パーツ[残り文字列] = ""
    Next
    Break
    #↑残りの文字列に空文字列を代入して処理を終了する。
    EndSw
    Case 8
    Do
    Do
    文字パーツ[文字パーツ番号] = Call("判定名$(Wide(文字パーツ番号))文字目選定")
    Loop While (文字パーツ[文字パーツ番号] = Call(子音算出,Right(文字パーツ[(文字パーツ番号 - 1)],1)))
    #↑算出した文字が直前に算出した文字列の最後の文字の子音ではないかどうかをサブルーチン「子音算出」を使って調査し、同じであれば算出をやり直す。
    Loop While (InStr(文字パーツ[(文字パーツ番号 - 1)],文字パーツ[文字パーツ番号]) <> 0)
    #↑算出した文字が直前に算出した文字列の中にないかどうかを調査し、入っていれば算出をやり直す。
    EndSw
    Next
    共通名候補 = "$(文字パーツ[1])$(文字パーツ[2])$(文字パーツ[3])$(文字パーツ[4])$(文字パーツ[5])$(文字パーツ[6])$(文字パーツ[7])$(文字パーツ[8])"


    子音算出:
    Local 子音
    Switch Args(1)
    Case ア カ サ タ ナ ハ マ ヤ ラ ワ バ パ キャ ギャ ジャ シャ ツァ クァ ァ ファ ヒャ チャ ニャ ミャ リャ ガ ダ ザ テャ デャ トァ ドァ
    子音 = ア
    Case イ キ シ チ ニ ヒ ミ リ ビ ピ キィ ギィ ジィ シィ ツィ クィ ィ フィ ヒィ チィ ニィ ミィ リィ ギ ヂ ジ ティ ディ トィ ドィ
    子音 = イ
    Case ウ ク ス ツ ヌ フ ム ユ ル ブ プ キュ ギュ ジュ シュ クゥ ゥ ヒュ チュ ニュ ミュ リュ グ ヅ ズ テュ デュ トゥ ドゥ
    子音 = ウ
    Case エ ケ セ テ ネ ヘ メ レ ベ ペ キェ ギェ ジェ シェ ツェ クェ ェ フェ ヒェ チェ ニェ ミェ リェ ゲ デ ゼ テェ デェ トェ ドェ
    子音 = エ
    Case オ コ ソ ト ノ ホ モ ヨ ロ ヲ ボ ポ キョ ギョ ジョ ショ ツォ クォ ォ フォ ヒョ チョ ニョ ミョ リョ ゴ ド ゾ テョ デョ トォ ドォ
    子音 = オ
    Case ン
    子音 = ン
    EndSw
    Return 子音

    拗音判定:
    Local 結果
    Switch Args(1)
    Case キャ ギャ ジャ シャ ツァ クァ ファ ヒャ チャ ニャ ミャ リャ テャ デャ トァ ドァ キィ ギィ ジィ シィ ツィ クィ フィ ヒィ チィ ニィ ミィ リィ ティ ディ トィ ドィ キュ ギュ ジュ シュ クゥ ヒュ チュ ニュ ミュ リュ テュ デュ トゥ ドゥ キェ ギェ ジェ シェ ツェ クェ フェ ヒェ チェ ニェ ミェ リェ テェ デェ トェ ドェ キョ ギョ ジョ ショ ツォ クォ ォ フォ ヒョ チョ ニョ ミョ リョ テョ デョ トォ ドォ
    結果 = 拗音
    Case Else
    結果 = それ以外
    EndSw
    Return 結果

    ↑イベントデータここまで

    判定名1文字目選定〜判定名8文字目選定のサブルーチンはそれぞれ1音を表す片仮名(判定名1文字目選定は2音も多い)をランダムに返すサブルーチンですが、
    長い上に単調なので、省略しています。

    上記のイベントは名前付きザコに使用しようとしている名前算出用のサブルーチンです。
    Doコマンドの連続のせいかとも思いましたが、処理を1回だけならフリーズはしませんでした。

    動作しないと思われるDoコマンドの修復を行ったところフリーズするようになりました。
    どうすれば正常に動くようになるのでしょうか。
    エラーは出ていません。

    最後の「共通名候補」に実際に使われる名前が入るようになっています。
引用返信/返信 削除キー/
■14724 / inTopicNo.2)  Re[1]: 文字列算出でフリーズしてしまう
□投稿者/ TomTom -(2004/07/28(Wed) 22:05:57) [ID:xuAeOXO7]
    えーっと、インデントくらいしてください。前にも言いませんでしたっけね?

    >判定名1文字目選定〜判定名8文字目選定のサブルーチンはそれぞれ1音を表す片仮名(判定名1文字目選定は2音も多い)をランダムに返すサブルーチンですが、
    >長い上に単調なので、省略しています。

    省略しないで下さい。こんなわけのわからない、ランダムで文字を返すようなサブルーチンの、
    肝心のランダム生成の部分がわからないと何も出来ません。
    しかし、掲示板に貼り付けられても鬱陶しいだけなのは確かです。

    ですから、実際に症状を確認することが出来るテストファイルを提示してください。


    それと余談になりますが、「ア」「イ」「ウ」「エ」「オ」というのは一般に『母音』と言います。
    覚えておいたほうがいいですよ。
引用返信/返信 削除キー/
■14725 / inTopicNo.3)  Re[1]: 文字列算出でフリーズしてしまう
□投稿者/ GAMEMASTER -(2004/07/28(Wed) 22:36:00) [ID:xaPezZZQ]
http://nagoya.cool.ne.jp/gamemaster/
     GAMEMASTERです。

    > (前略)
    >
    > 上記のイベントは名前付きザコに使用しようとしている名前算出用のサブルーチンです。
    > Doコマンドの連続のせいかとも思いましたが、処理を1回だけならフリーズはしませんでした。
    >
    > 動作しないと思われるDoコマンドの修復を行ったところフリーズするようになりました。
    > どうすれば正常に動くようになるのでしょうか。
    > エラーは出ていません。

     原因はこの部分と思われます。

    > Loop While (Call(拗音判定,文字パーツ[文字パーツ番号]) = Call(拗音判定,文字パーツ[(文字パーツ番号 - 1)]))
    > #↑算出した文字と直前に算出した文字列が共に拗音であるかをサブルーチン「拗音判定」を使って調査し、共に拗音であった場合は算出をやり直す。

    > Loop While (Call(拗音判定,文字パーツ[文字パーツ番号]) = Call(拗音判定,文字パーツ[(文字パーツ番号 - 2)]))
    > #↑算出した文字と直前に算出した文字列が共に拗音であるかをサブルーチン「拗音判定」を使って調査し、共に拗音であった場合は算出をやり直す。

     共に拗音である場合だけでなく、共に拗音でない場合もWhile部分の条件を満たす(算出をやり直す)ため、サブルーチンで判定させる2文字のうちどちらか一方が拗音にならない限りループを続けることになります。
     以下の通りに修正したところ、正常に動作しました。


     Loop While (Call(拗音判定,文字パーツ[文字パーツ番号]) = 拗音 And Call(拗音判定,文字パーツ[(文字パーツ番号 - 1)]) = 拗音)
     #↑算出した文字と直前に算出した文字列が共に拗音であるかをサブルーチン「拗音判定」を使って調査し、共に拗音であった場合は算出をやり直す。

     Loop While (Call(拗音判定,文字パーツ[文字パーツ番号]) = 拗音 And Call(拗音判定,文字パーツ[(文字パーツ番号 - 2)]) = 拗音)
     #↑算出した文字と直前に算出した文字列が共に拗音であるかをサブルーチン「拗音判定」を使って調査し、共に拗音であった場合は算出をやり直す。


     参考になれば幸いです。

     もう時間がないようでございますね。では、これにて退散させてもらいましょう。
引用返信/返信 削除キー/
■14726 / inTopicNo.4)  Re[2]: 文字列算出でフリーズしてしまう
□投稿者/ ドラモンスター -(2004/07/28(Wed) 23:15:38) [ID:57T32sOL]
http://www5f.biglobe.ne.jp/~dramonster/index.html
    私はドラモンスターです。

    Doコマンドの永久無限ループになってしまっていたのですね。

    GAMEMASTERさんの言われた通りにしたら直りました。
    ありがとうございました。
解決済み!
引用返信/返信 削除キー/



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

このトピックに書きこむ

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

Pass/

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

- Child Tree -
- Antispam Version -