◀ANSI版開発トップへ
  • 3509 バグ修正とかその4
    • 3514 RE: バグ修正とかその4
      • 3517 Re2: バグ修正とかその4
        • 3518 Re3: バグ修正とかその4
          • 3522 Re4: 改定1 fix030428d
            • 3523 Re5: 改定1 fix030428d
            • 3525 Re5: fix030428d レビュー中
              • 3526 Re6: fix030428d レビュー中
              • 3527 Re6: fix030428d レビュー中
                • 3528 Re7: fix030428d レビュー中
                  • 3529 Re8: fix030428d レビュー中
  • [3509] バグ修正とかその4 もか 2004年03月28日 23:47

    幾つかのバグ修正と、開発3456だったけど取り下げたものの一部です。
    それと、ファイルの最上部・最下部への移動を高速化しました。
    その代わり、次の行への移動とかで、数ns遅くなってしまうかも

    修正した(はずの)バグは、
    ・カーソルがEOFのみの行以降にあると、移動しただけで落ちるバグ
    >>data:3473
    ・コメント後の最終行に文字列を入力したときブロックコメントと認識されることがある(BugsInfo登録名)
    >>data:3115 ほか。ちょっと家のincmログが足りないみたいで関連記事は未調査。
    ・論理行先頭でインデントされた行にタブが含まれると、折り返し位置が間違っている
    >>dev:3490

    ヤフーグループのブリーフケース fix030428c.zipの予定です。(すぐアップします)
    • [3514] RE: バグ修正とかその4 もか 2004年04月01日 15:04

      >・カーソルがEOFのみの行以降にあると、移動しただけで落ちるバグ
      >>data:3725 も直したつもり。。
      • [3517] Re2: バグ修正とかその4 FILE 2004年04月02日 01:55

        ▼ もかさん
        > >・カーソルがEOFのみの行以降にあると、移動しただけで落ちるバグ
        > >>data:3725 も直したつもり。。

         こんばんは。ご対応ありがとうございます。

         fix040328c.zipをダウンロードし、patchを当てて
        みましたが、Access Violationとなってしまいました。
        (Win95でデバッグ実行時)

         CLayoutMgr.cppのInsertData_CLayoutMgr関数内で、
        「空でないテキストの最後に行を作る場合」ではなく、
        「空でないテキストの最後に行を変更する場合」で
        NULLポインタにアクセスしようとしている模様です。
        (pLayoutに代入するm_pLayoutPrevReferの値が0x00000000)

         また、この時、nLineLenが初期化されていないのも、
        気になっております。

        以上、解決の手がかりになれば幸いです。
        • [3518] Re3: バグ修正とかその4 もか 2004年04月02日 02:32

          ぬぬぬ。なるほど、また(今度)見てみます。
          で、私もやってみると落ちました。がーん。
          カーソル移動は大丈夫だけど、データを変更すると落ちると。

          このパッチを当てても(まだ|よけい)変な動きするので、統合はお待ちください。

          そもそも、Viewを移動してフォーカスが戻ってきたとき、カーソル位置を有効な位置に移動(だたしCRとLFの間は有効位置)させないと、根本的解決にならないかも。

          # 早い者勝ちですので、わかるかた、お先にどうぞ。
          • [3522] Re4: 改定1 fix030428d もか 2004年04月03日 02:35

            cパッチで、[EOF]だけ折り返されたときに[EOF]の左に移動できなくなっていたのを修正
            EOF位置に移動する座標計算部分を関数化
            前回の桁位置(m_nCaretPosX_Prev)を設定したほうがよさそうな場所は設定
            コマンドラインオプションで、EOF以降を指定したとき、ファイルの末尾に移動しなかったのを修正

            >>data:3725 (変なカーソル位置で、文字挿入で落ちる)
            に対応していなかったので、対応しました。
            ▼FILE氏
            >>CLayoutMgr.cppのInsertData_CLayoutMgr関数内でNULLポインタにアクセス
            の側だけ修正しようとしたら、再作画されないし、変な行へのデータ挿入要求は困ってしまうから、
            >Viewを移動してフォーカスが戻ってきたとき、カーソル位置を有効な位置に移動
            するようにしました。
            fix030428d.zip ってやつです。

            # CLayoutMgr::CaretPos_Phys2Log EOFだけ折り返しに未対応ぽい?
            • [3523] Re5: 改定1 fix030428d FILE 2004年04月03日 19:48

              ▼ もかさん
              > >>CLayoutMgr.cppのInsertData_CLayoutMgr関数内でNULLポインタにアクセス
              > の側だけ修正しようとしたら、再作画されないし、変な行へのデータ挿入要求は困ってしまうから、
              > >Viewを移動してフォーカスが戻ってきたとき、カーソル位置を有効な位置に移動
              > するようにしました。
              > fix030428d.zip ってやつです。

               こんばんは。

               fix040328d.zipをダウンロードし、patchを当ててると
              落ちなくなりました。

              ご対応、ありがとうございました。
            • [3525] Re5: fix030428d レビュー中 げんた 2004年04月10日 17:25

              朝から変更箇所を確認していたのですがよくわからなくて途中で寝ちゃいました.で終わらせるわけにも行きませんので質問です.
              1. CEditView_Command.cpp
              CEditView::Command_LEFT()で
              >// 2004.03.28 Moca EOFだけの行以降の途中にカーソルがあると落ちるバグ修正
              >else if( pcLayout ){
              となっていますが,EOF以降にキャレットがある場合に左移動を指示した場合にMoveCursor以外なにもしていませんが,MoveCursorの改良のおかげで適切な位置にキャレットを移動してもらえるという動作でOKでしょうか.

              >CEditView::Command_RIGHT()
              >if( NULL == pcLayout ){
              > goto end_of_func;
              >}
              end_of_funcに飛ばす代わりにnPosX = 0を設定してカーソル位置+選択範囲設定を行うようになっていますが,pcLayoutがNULLのときにそれがどういう違いをうむのかよくわかりませんでした.

              2. CLayoutMgr_New.cpp
              Layoutの両関数においてnPosXの意味を変更していますが,禁則処理で行頭での処理を避ける判定部分を
              && nPosXの部分を→&& ( nPosX > nIndent ) する処理が漏れているようです.

              nPosXとnMaxLineSizeの両方ともnIndentだけ増えているので
              ・比較の両辺に上の変数が共に現れている物は影響なし
              ・TAB幅の算出にnPosXを使っている部分は意図通り
              と考えてnPosXを追跡すると残るのは上の条件文だけとなります.

              >m_nLineTypeBot = nCOMMENTMODE;
              というのが一部削除されていますが「一部」というところが何となく謎なんですが...なんか説明して頂けます?

              この2つ以外は取り込み完了しています.また追加変更に対してパッチの作り直しはしてくださらなくて結構です.(というかもう上記以外は取り込んでしまったので...)

              ---
              何のためになおしたのか説明が全然書いてないと,意図を確認するところから始めないといけないのでえらく大変.(;_;)
              適当に理解した内容をコメントに追加しながら進めていますが...

              CEditView::m_nCaretPosX_Prev の意味も本日初めてわかったのでコメントを追加しておきました.
              (不明だけどと但し書きして修正した2年前の自分のコメントを発見して...)
              • [3526] Re6: fix030428d レビュー中 もか 2004年04月11日 00:46

                >1. CEditView_Command.cpp
                >>else if( pcLayout ){
                そういう意味でOKです。
                >CEditView::Command_RIGHT()
                >>if( NULL == pcLayout ){
                >> goto end_of_func;
                >>}
                いままでは、EOF以降にカーソルがあったときに右を押しても何も起きなかったのを、EOFに移動するようになります。
                実際には、考慮漏れがないかぎり、カーソルがEOFより後ろにはこないので、変わらないかも。
                >2. CLayoutMgr_New.cpp
                >&& nPosXの部分を→&& ( nPosX > nIndent ) する処理が漏れているようです.
                はい、たしかに。すみません。

                >>m_nLineTypeBot = nCOMMENTMODE;
                CLayoutMgr::DoLayout_Rangeでは、今まで、ご承知のとおり、レイアウト各行の色分けが終わると、それをm_nLineTypeBot = nCOMMENTMODEとしていました。
                しかし、ファイルの終端まで色分けを変更しないことがあるため、m_nLineTypeBotに、「変更した範囲内で最後に見た行の後ろの色」を設定していました。
                関数の最後で、最後に色を再設定した行が最終行であるかを確認して変更するようにしてあります。

                >CEditView::m_nCaretPosX_Prev の意味も本日初めてわかったのでコメントを追加しておきました.
                >(不明だけどと但し書きして修正した2年前の自分のコメントを発見して...)
                ↑たしか、CNormalProssessだったような。

                # かなり巨大なプログラムゆえ、未だにほとんど読んだことがない部分が結構あるんですよね。
                # 自分で作ったわけでもないので、仮定している範囲がからないし。
              • [3527] Re6: fix030428d レビュー中 げんた 2004年04月11日 16:05

                もう1点コメント

                CEditView::Command_RIGHT()でMoveCursorを削除することで,右を押して選択が解除された後にキャレットを選択範囲末尾に移動しないように変更していますが,Command_LEFTの方は従来通りですと右と左で処理の一貫性が無くなるため,ここは変更しない方がいいと思います.
                • [3528] Re7: fix030428d レビュー中 もか 2004年04月11日 17:47

                  >CEditView::Command_RIGHT()でMoveCursorを削除することで,
                  該当個所が見つからないのですが、どこのことでしょうか。

                  # CommandRIGHT/LEFT
                  # goto end_of_func (LEFTのみ)
                  # end_of_func:;
                  # }
                  # return;
                  # 直下にgotoとか、end_of_funcなのに、ループ中だったりして、リピートを後でつけた名残なのかな
                  • [3529] Re8: fix030428d レビュー中 げんた 2004年04月11日 18:09

                    >>CEditView::Command_RIGHT()でMoveCursorを削除することで,
                    >該当個所が見つからないのですが、どこのことでしょうか。
                    本当だ.diffファイルにはないですね.
                    私が色々やっている間に間違って消してしまったのかも.危ないところだった((;・・ヘ)