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

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

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

■21988 / inTopicNo.1)  Do文(?)が「不正です」??
  
□投稿者/ ルドロフ -(2010/04/19(Mon) 01:58:26) [ID:nq7MOiNF]
    現在私の作っている処理で変なエラーが起こっています。改善策を教えてください。
    場所の特定はできており、Do文(?)の一番最後のLoopで起きます。
    エラーは「イベントデータが不正です。」というものです。

    一番困るのは必ず起こるわけではないということです。

    問題となっているDo文(?)はこの記事への返信という形でアップします。
    返信される方は親記事に返信してください。
引用返信/返信 削除キー/
■21989 / inTopicNo.2)  「問題となっているDo文(?)」
□投稿者/ ルドロフ -(2010/04/19(Mon) 01:59:06) [ID:nq7MOiNF]
    Do
        Wait 0
        Incr 調査ナンバー2
        LineRead Eval("内部$(Args(1))調査") 調査2
        Switch Args(2)
        Case CSV
            Array Var 調査2 ","
            If 調査ナンバー2 = 1 Then
                CopyArray Var 情報値
                CreateFolder Data\System\Eve\Csv
                Open "Data\System\Eve\Csv\$(情報値[1])詳細情報.eve" For 出力 As Eval("内部$(Args(1))調査2")
                Print Eval("内部$(Args(1))調査2") "$(情報値[1])詳細情報:"
                Print Eval("内部$(Args(1))調査2") "Local 結果"
                Print Eval("内部$(Args(1))調査2") "Switch Args(1)"
            Else
                Print Eval("内部$(Args(1))調査2") "Case $((調査ナンバー2 - 1))"
                Print Eval("内部$(Args(1))調査2") "    Switch Args(2)"
                For 調査ロクスケ = 1 To Count(情報値)
                    Wait 0
                    If 調査ロクスケ = 1 Then
                        Skip
                    Else
                        Print Eval("内部$(Args(1))調査2") "    Case $(情報値[調査ロクスケ])"
                        Print Eval("内部$(Args(1))調査2") "        結果 = $(IIf((Var[調査ロクスケ] <> ""),"$(IIf((Left(Var[調査ロクスケ],6) = Random),"$(Random(Right(Var[調査ロクスケ],(Len(Var[調査ロクスケ]) - 6))))","$(IIf((Left(Var[調査ロクスケ],4) = Eval),"$(Eval("Eval("$(Right(Var[調査ロクスケ],(Len(Var[調査ロクスケ]) - 4)))")"))","$(Eval("$(Var[調査ロクスケ])"))"))"))",""""))"
                    EndIf
                Next
                Print Eval("内部$(Args(1))調査2") "    EndSw"
            EndIf
        Case Else
            If 調査ナンバー2 = 1 Then
                CreateFolder Data\System\Eve\Txt
                Open "Data\System\Eve\Txt\$(Args(2))変換情報.eve" For 出力 As Eval("内部$(Args(1))調査2")
                Print Eval("内部$(Args(1))調査2") "$(Args(2))変換情報:"
                Print Eval("内部$(Args(1))調査2") "Local 結果"
                Print Eval("内部$(Args(1))調査2") "Switch Args(1)"
            EndIf
            Print Eval("内部$(Args(1))調査2") "Case $(調査ナンバー2)"
            Print Eval("内部$(Args(1))調査2") "    結果 = $(IIf((調査2 <> ""),"$(IIf((Left(調査2,6) = Random),"$(Random(Right(調査2,(Len(調査2) - 6))))","$(IIf((Left(調査2,4) = Eval),"$(Eval("Eval("$(Right(調査2,(Len(調査2) - 4)))")"))","$(Eval("$(調査2)"))"))"))",""""))"
        EndSw
    Loop While (Eval("EOF(内部$(Args(1))調査)") = 0)

引用返信/返信 削除キー/
■21991 / inTopicNo.3)  条件式は合っていますか?
□投稿者/ 中箱 -(2010/04/20(Tue) 19:01:31) [ID:XAPi9INn]
    >Loop While (Eval("EOF(内部$(Args(1))調査)") = 0)

    ここの条件式ですが、EOF()関数の結果(0か1)をEvalすることに意味が分かりませんので、
    EOF(Eval("内部$(Args(1))調査"))とするべきところを打ち間違えたのを見落としているだけでは。


    PS.
    見たところ、このDo〜Loop部においてはEval("内部$(Args(1))調査")やEval("内部$(Args(1))調査2")の結果は一定値を取るようですから、
    同じ結果を得るために何度もEval関数を呼んでいることになりますよね?

    どうせ同じ結果ならその都度Eval関数を呼ばずに、変数に入れてしまっても問題ないはずです。
    むしろその方が視認性が上がりますし、修正時の手間、打ち間違いによるミスを起こす可能性は減るでしょう。実行速度に関しても多少上がることはあっても明確に下がることはまず無いでしょうし。

    (もしもLoop行の条件式が間違いだったのならですが、始めから変数を使っていれば、問題の発生も避けられた可能性が高かったように思います)
引用返信/返信 削除キー/
■21992 / inTopicNo.4)  説明し忘れ
□投稿者/ ルドロフ -(2010/04/20(Tue) 23:11:53) [ID:nq7MOiNF]
    文の中で使用している
    「Eval("内部$(Args(1))調査")」や「Eval("内部$(Args(1))調査2")」は
    ファイルハンドルです。

    説明不足申し訳ありませんでした。

    アップしたのはサブルーチンの一部なのですが、
    全てアップした方がいいですか?
引用返信/返信 削除キー/
■21994 / inTopicNo.5)  Re[3]: 説明し忘れ
□投稿者/ 中箱 -(2010/04/21(Wed) 00:30:37) [ID:XAPi9INn]
    2010/04/21(Wed) 01:01:53 編集(投稿者)

    >文の中で使用している
    >「Eval("内部$(Args(1))調査")」や「Eval("内部$(Args(1))調査2")」は
    >ファイルハンドルです。

    >説明不足申し訳ありませんでした。

    いえ、説明不足ではありませんでしたよ。
    ルドロフさんがOpenコマンドについての覚え違いと
    私の説明が良くなかったのが原因。こちらこそすいませんでした。


    OpenコマンドのAsの後ろで指定している「Eval("内部$(Args(1))調査")」などは、ファイルハンドルではなくて、「ファイルハンドルを格納する変数名」です。
    (ヘルプのOpenコマンド項を見直してください)

    ですから例えば
     Open "〜〜.eve" For 出力 As ハンドル
    とした場合、
    「ハンドル」という変数に、〜〜.eveに出力するためのファイルハンドルが入っている事になります
    「ハンドル」はあくまでも変数ですから、
     仮ハンドル = ハンドル
    のようにしてしまえば、変数「仮ハンドル」にも、〜〜.eveに出力するためのファイルハンドルが入ります。

    よって
     Open "〜〜.eve" For 出力 As ハンドル
     Print ハンドル "test"

     Open "〜〜.eve" For 出力 As ハンドル
     仮ハンドル = ハンドル
     Print 仮ハンドル "test"
    としても〜〜.eveに問題なくPrintできます

    同様に
     ガン = ル
     Open "〜〜.eve" For 出力 As Eval("ハンド$(ガン)")
     仮ハンドル = Eval("ハンド$(ガン)")
     Print Eval("ハンド$(ガン)") "test1"
     Print 仮ハンドル "test2"
     Print ハンドル "test0"
    とすれば、3行とも〜〜.eveに書き込まれます。



    >アップしたのはサブルーチンの一部なのですが、
    >全てアップした方がいいですか?

    Loop行の条件式 「Eval("EOF(内部$(Args(1))調査)")」が書き間違いでは無いのであれば、
    残り部分の掲示よりも先に、
    このDoループの終了条件を説明していただけないでしょうか。
    前の記事にも書きましたが、すいませんが式を見ただけでは私にはどういう時にループ終了して欲しいのか分からなかったので。
引用返信/返信 削除キー/
■21995 / inTopicNo.6)  Re[4]: 説明し忘れ
□投稿者/ ルドロフ -(2010/04/21(Wed) 01:18:30) [ID:nq7MOiNF]
    2010/04/28(Wed) 10:19:02 編集(投稿者)
    2010/04/21(Wed) 06:08:12 編集(投稿者)

    これ以上は私としても全文をアップしなければ説明のしようがないので
    全文をアップします。
    ちなみにこのサブルーチンでは問題となっている行以外にも
    他の行でもエラーを吐きます。

    どのエラーにも共通しているのは
    ・エラー文「イベントデータが不正です。」。
    ・ファイルハンドルの絡むコマンドの書かれた行で起きる。
    ・必ず発生するわけではない。
    ということです。

    サブルーチンの呼び出し例は二つあります。
    「AccessIncludeFile バケラッタ CSV 無」
    で「バケラッタ.csv」というCSVを元に二連式Switchコマンドを使ったイベントファイルを作成します。
    「AccessIncludeFile 場所データベース 場所 無」
    で「場所データベース.txt」というTXTを元にSwitchコマンドを使ったイベントファイルを作成します。
    二番目の引数はTXTを用いて作成する際のファイル名になります。
    CSVを用いて作成する場合は
    「Microsoft Excel」における「A1」のセルに書かれた語句を使用するので
    サブルーチンコールで指定する必要がありません。
    三番目の引数は例ではどちらも「無」になっていますが、
    これを「有」にすると、ファイル作成作業中にメッセージを表示します。

    Doループの終了条件としては
    「元になるファイルの読み出しが終わった時」
    という感じです。

    返信はこの記事にお願いします。

    修正版をアップしました。但し、これでもエラーが出ます。
引用返信/返信 削除キー/
■21996 / inTopicNo.7)  サブルーチン全文
□投稿者/ ルドロフ -(2010/04/21(Wed) 01:19:12) [ID:nq7MOiNF]
    2010/04/28(Wed) 10:17:34 編集(投稿者)

    AccessIncludeFile:
    Local 調査ナンバー2 調査2
    If Eval("Dir(Data\System\$(IIf((Args(2) = CSV),Csv,Txt))\$(Args(1)).$(IIf((Args(2) = CSV),csv,txt)))") <> "" Then
        If Args(3) = 有 Then
            AutoTalk システム
            0.1;$(IIf((Args(2) = CSV),複式,単式))スイッチ型サブルーチン.「$(IIf((Args(2) = CSV),"$(Args(1))","$(Args(2))"))」を作成しています。.しばらくお待ちください。
            Suspend
        EndIf
        Open "Data\System\$(IIf((Args(2) = CSV),Csv,Txt))\$(Args(1)).$(IIf((Args(2) = CSV),csv,txt))" For 入力 As 内部調査
        CreateFolder Data\System\Eve
        Do
            Wait 0
            Incr 調査ナンバー2
            LineRead 内部調査 調査2
            Switch Args(2)
            Case CSV
                Array Var 調査2 ","
                If 調査ナンバー2 = 1 Then
                    CopyArray Var 情報値
                    CreateFolder Data\System\Eve\Csv
                    Open "Data\System\Eve\Csv\$(情報値[1])詳細情報.eve" For 出力 As 内部調査2
                    Print 内部調査2 "$(情報値[1])詳細情報:"
                    Print 内部調査2 "Local 結果"
                    Print 内部調査2 "Switch Args(1)"
                Else
                    Print 内部調査2 "Case $((調査ナンバー2 - 1))"
                    Print 内部調査2 "    Switch Args(2)"
                    For 調査ロクスケ = 1 To Count(情報値)
                        Wait 0
                        If 調査ロクスケ = 1 Then
                            Skip
                        Else
                            Print 内部調査2 "    Case $(情報値[調査ロクスケ])"
                            Print 内部調査2 "        結果 = $(IIf((Var[調査ロクスケ] <> ""),"$(IIf((Left(Var[調査ロクスケ],6) = Random),"$(Random(Right(Var[調査ロクスケ],(Len(Var[調査ロクスケ]) - 6))))","$(IIf((Left(Var[調査ロクスケ],4) = Eval),"$(Eval("Eval("$(Right(Var[調査ロクスケ],(Len(Var[調査ロクスケ]) - 4)))")"))","$(Var[調査ロクスケ])"))"))",""""))"
                        EndIf
                    Next
                    Print 内部調査2 "    EndSw"
                EndIf
            Case Else
                If 調査ナンバー2 = 1 Then
                    CreateFolder Data\System\Eve\Txt
                    Open "Data\System\Eve\Txt\$(Args(2))変換情報.eve" For 出力 As 内部調査2
                    Print 内部調査2 "$(Args(2))変換情報:"
                    Print 内部調査2 "Local 結果"
                    Print 内部調査2 "Switch Args(1)"
                EndIf
                Print 内部調査2 "Case $(調査ナンバー2)"
                Print 内部調査2 "    結果 = $(IIf((調査2 <> ""),"$(IIf((Left(調査2,6) = Random),"$(Random(Right(調査2,(Len(調査2) - 6))))","$(IIf((Left(調査2,4) = Eval),"$(Eval("Eval("$(Right(調査2,(Len(調査2) - 4)))")"))","$(調査2)"))"))",""""))"
            EndSw
        Loop While (EOF(内部調査) = 0)
        Print 内部調査2 "EndSw"
        Print 内部調査2 "Return 結果"
        Close 内部調査
        Close 内部調査2
        UnSet 内部調査
        UnSet 内部調査2
        Require "$(IIf((Args(2) = CSV),"Data\System\Eve\Csv\$(情報値[1])詳細情報.eve","Data\System\Eve\Txt\$(Args(2))変換情報.eve"))"
    Else
        Talk システム
        $(IIf((Args(2) = CSV),複式,単式))スイッチ型サブルーチン作成用ファイル;「$(Args(1))」が既定のフォルダにありません。
        End
        GameClear
    EndIf
    Return

引用返信/返信 削除キー/
■22000 / inTopicNo.8)  Re[5]: 説明し忘れ
□投稿者/ ルドロフ -(2010/04/30(Fri) 01:46:57) [ID:nq7MOiNF]
    簡単にしたはずなのにいまだにエラーが出る理由がわかりません。
    もう私にはお手上げです。
引用返信/返信 削除キー/
■22001 / inTopicNo.9)  Re[6]: 説明し忘れ
□投稿者/ ルドロフ -(2010/05/01(Sat) 15:30:07) [ID:nq7MOiNF]
    すみません。自己解決しました。
    ファイルハンドルを格納する変数をローカル変数としただけです。
    なぜこれで解決したのかがわかりません。
    誰か理由を教えてください。
    とりあえず「解決済み」にはしておきます。
解決済み!
引用返信/返信 削除キー/
■22005 / inTopicNo.10)  私見です
□投稿者/ Mr.tonkati -(2010/05/04(Tue) 15:20:14) [ID:j9mRlgOb]
    2010/05/04(Tue) 15:27:20 編集(投稿者)

    こんにちは、Mr.tonkatiなるものです。

    No22001に返信(ルドロフさんの記事)

    > ファイルハンドルを格納する変数をローカル変数としただけです。
    > なぜこれで解決したのかがわかりません。
    > 誰か理由を教えてください。


    非常に申し上げにくいのですが、その理由は、誰にも、わからないと思います。
    (ただ、ファイルハンドルはローカル変数に格納すべきだろうとは思いますが)


    わたしは絶対にプログラムに詳しくないですので、以下の文を鵜呑みになさらずに、全力で疑いながら読み進めていって下さいませ。


    No21996のサブルーチン(以下aルーチン)は多分問題ないルーチンではないかと思います。

    つまり、わたし的にはまずエラー文の出ようがないサブルーチンなわけなのですが、ルドロフ様ご自身が、このソースと関係なく、何か色々と取り違えているのではないでしょうか。


    とりあえず現状のaルーチンの仕様上、

    > 二番目の引数はTXTを用いて作成する際のファイル名になります。
    > CSVを用いて作成する場合は
    > 「Microsoft Excel」における「A1」のセルに書かれた語句を使用するので

    ここまではともかく、

    > サブルーチンコールで指定する必要がありません。

    これは誤りです。
    (つまり、 TXTを用いて作成するときに指定する必要がない)

    率直な結論として、「ルドロフ様が何にどうつまづいているのかがよく理解できない」というところです。
    (もっとも、理解できたところで高確率でわたしでは力になれないでしょう。その節は、ご容赦下さい)


    以下はオマケです。
    先日の中箱様の指摘(No21991のPSの部分)と思いっきり趣旨の被った内容ですが。

    あなたはIIf関数を度々用いていらっしゃいますが、せめて条件式が「Args(2) = CSV」のものだけでも冒頭で初期化処理として一括で行ってはいかがでしょうか。

    //===
    //(前略)
    local アヒル
    If Args(2) = CSV then
    アヒル[1] = "Csv"
    アヒル[2] = "csv"
    // ・
    // ・
    else
    アヒル[1] = "Txt"
    アヒル[2] = "txt"
    // ・
    // ・
    Endif
    //(後略)
    //===

    こうすることにより、If判定の回数が減り、随分見やすい、修正もより容易なものとなるのではないでしょうか。


    (
    ただし、Args(2)の要素をインデックスとした配列に、やはり初期化処理で必要な値を放り込んでおき、実際の処理でその配列を参照させるという手法もあり、こちらだととりあえず「Args(2) = CSV」のIf判定はする必要はなくなりますが…わたし的にわかりにくいかと思います。

    あと、
    //===
    local アヒル
    アヒル[1] = IIf(Args(2) = CSV,Csv,Txt)
    アヒル[2] = IIf(Args(2) = CSV,csv,txt)
    // ・
    // ・
    //===

    と、コンパクトにする手もありですが、現状では条件式がおなじIf判定を5回もさせるのはいかがなものでしょうかね。
    まあ、ケースバイケースないしお好みでということでどうですか。
    )

    見易さ、修正のしやすさなどの度合いを「メンテナンス性」なんていったりしますが、この辺りをもう少し心掛けて下されば、ミスも減りますし、また質問掲示板におけるあなたの質問に対する回答率及び平均回答速度も向上するやも知れません。


    メンテナンス性にちなんでもう一点述べさせていただければ。
    あなたの場合、基本的に(あくまで「基本的に」です)関数は変数に代入して使うものだと考えた方が良いやも知れません。
    とにかく、括弧の中で更に括弧を使うのはあまりよくない(見づらい)ことだと理解していただければ、と思います。

    //===(例)

    local _P
    _P = IIf(random(InStrRev("makibisikowai",Mid("wai",random(3),1))) > 6,"大","小")
    talk
    $(_P)だ!!
    end
    //↑こうするよりも…

    local _P _Q

    _Q[0] = random(3)
    _Q[1] = Mid("wai",_Q[0],1)
    _Q[2] = InStrRev("makibisikowai",_Q[1])
    _Q[3] = random(_Q[2])

    _P = IIf(_Q[3] > 6,"大","小")
    talk
    $(_P)だ!!
    end
    //↑とした方が良い。なぜなら、

    talk
    $(_Q[0])、$(_Q[3])、$(_P)だ!!
    end

    //↑のような形で、確認するのが容易になるため。

    //===


    つい、自分でも出来てないことを偉そうに書き綴ってしまいました。
    もし不快に思われましたら、完全黙殺あるいは不快感を表明してくださいませ(後者っぽい場合は2度とこういった書き込みは致しませんので)。


    また、的外れであれば、失礼しました。
引用返信/返信 削除キー/



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

このトピックに書きこむ

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

Pass/

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

- Child Tree -
- Antispam Version -