◀ANSI版開発トップへ
  • 920 ssrc_2001-12-01_plus.lzh 実装修正
    • 923 Re:ssrc_2001-12-01_plus.lzh 実装修正
      • 937 Re2:ssrc_2001-12-01_plus.lzh 実装修正
        • 938 Re3:ssrc_2001-12-01_plus.lzh 実装修正
          • 939 Re4:ssrc_2001-12-01_plus.lzh 実装修正
            • 942 Re5:ssrc_2001-12-01_plus.lzh 実装修正
              • 943 Re6:ssrc_2001-12-01_plus.lzh 実装修正
                • 945 Re7:ssrc_2001-12-01_plus.lzh 実装修正
                  • 946 Re8:ssrc_2001-12-01_plus.lzh 実装修正
                    • 947 Re9:ssrc_2001-12-01_plus.lzh 実装修正
                      • 948 Re10:ssrc_2001-12-01_plus.lzh 実装修正
                        • 950 Re11:ssrc_2001-12-01_plus.lzh 実装修正
              • 944 Re6:ssrc_2001-12-01_plus.lzh 実装修正
                • 956 Re7:ssrc_2001-12-01_plus.lzh 実装修正
                  • 957 Re8:ssrc_2001-12-01_plus.lzh 実装修正
                    • 960 Re9:ssrc_2001-12-01_plus.lzh 実装修正
  • [920] ssrc_2001-12-01_plus.lzh 実装修正 hor 2001年12月14日 13:53

    ブックマークのフラグ実装、こんなかんじでいいですか?
    m_bModifyもBOOLにして、IsModifyed みたいなのを作ったほうがいいのでしょうか?

    class CDocLine
    (中略)
    int m_bModify; /* 変更フラグ */
    CEOL m_cEol; /* 行末コード */
    // enumEOLType m_enumEOLType; /* 改行コードの種類 */
    // int m_nEOLLen; /* 改行コードの長さ */
    // int m_nModifyCount; /* 変更回数 */

    void SetBookMark( void ); // 2001.12.14 hor ブックマークのON/OFFを切替える
    void SetBookMark( BOOL ); // 2001.12.14 hor ブックマークのON/OFFを指定する
    BOOL IsBookMark ( void ); // 2001.12.14 hor ブックマークのON/OFFを取得する

    protected:
    BOOL m_bBookMark; // 2001.12.03 hor ブックマーク
    };
    • [923] Re:ssrc_2001-12-01_plus.lzh 実装修正 げんた 2001年12月14日 18:12

      ▼ horさん
      > ブックマークのフラグ実装、こんなかんじでいいですか?
      意図が半分くらいしか伝わっていなかったみたい...

      まず、アクセス関数ではBOOLではなくてboolを使った方がいいのではないかと思います。bool/true/falseはC++の予約語なのでどこでも使える。
      データはたかがboolで32bit使うのもメモリがもったいないのでModifyの上位ビットをつかえないかな~と。true/falseに応じてbitをset/resetする。貧乏くさいかなぁ。こんなことしてもメモリ使用量には対して影響しないかな。

      > m_bModifyもBOOLにして、IsModifyed みたいなのを作ったほうがいいのでしょうか?
      暇ならやっておいた方がいいと思います。そうすればあとでデータ構造を変更できるので。

      余談ですが、CEditDocのGetDocumentAttribute()というのも昔は共有メモリ直アクセスだったのを変更しました。そうしておけばタイプ別設定情報の配置場所を後で簡単に変更できると思ったからです。
      • [937] Re2:ssrc_2001-12-01_plus.lzh 実装修正 hor 2001年12月17日 10:47

        ▼ げんたさん
        > まず、アクセス関数ではBOOLではなくてboolを使った方がいいのではないかと思います。bool/true/falseはC++の予約語なのでどこでも使える。
        > データはたかがboolで32bit使うのもメモリがもったいないのでModifyの上位ビットをつかえないかな~と。true/falseに応じてbitをset/resetする。
        > 貧乏くさいかなぁ。こんなことしてもメモリ使用量には対して影響しないかな。

        int型が4バイトでbool型が1バイトだと思ったので、
        m_bModify,m_bBookMarkを両方bool型にした方がメモリ消費が少ないと思ったのですが・・・

        勘違いしてます? 初心者なので教えていただけると助かります。
        • [938] Re3:ssrc_2001-12-01_plus.lzh 実装修正 げんた 2001年12月17日 11:13

          ▼horさん
          >int型が4バイトでbool型が1バイトだと思ったので、
          >m_bModify,m_bBookMarkを両方bool型にした方がメモリ消費が少ないと思ったのですが・・・
          >勘違いしてます? 初心者なので教えていただけると助かります。
          boolのメモリ消費はsizeof(bool)を出力してみたところ,1バイトでした.

          もう一つ考慮する点はメモリのAlignmentです.intはメモリ上で4の倍数のメモリ位置から配置されますので(オプションで変更できますけど,とりあえず一般論として),例えば sizeof(bool)==1,sizeof(int) == 4としたとき.
          bool a; bool b; int c; だと a, bで各1バイト,隙間2バイト,cで4バイトの合計8バイト消費.
          bool a; int c; bool b; だと aで1バイト,隙間3バイト,cで4バイト,bで1バイト,隙間3バイトの合計12バイト消費となると思います.

          ここまで来ると好みの問題かもしれませんが,私はintを区切って使うのが好きです.ビデオのシールもはさみで切って使う位なので.(←単なる貧乏性 ^^;)

          ---
          #include <stdio.h>

          #define showsize(X) printf( "sizeof(" #X ") == %d\n", sizeof( X ))

          int main()
          {
          struct A {
          bool a;
          bool b;
          int c;
          };

          struct B {
          bool a;
          int c;
          bool b;
          };

          showsize(char);
          showsize(int);
          showsize(bool);
          showsize(long);
          showsize(A);
          showsize(B);

          return 0;
          }
          • [939] Re4:ssrc_2001-12-01_plus.lzh 実装修正 hor 2001年12月17日 11:52

            ▼ げんたさん
            > ここまで来ると好みの問題かもしれませんが,私はintを区切って使うのが好きです.ビデオのシールもはさみで切って使う位なので.(←単なる貧乏性 ^^;)

            なるほど・・・コメントありがとうございました。
            intを区切るように変更します。
            • [942] Re5:ssrc_2001-12-01_plus.lzh 実装修正 hor 2001年12月17日 21:07

              > intを区切るように変更します。

              とは言ってみたものの、ビット操作の方法がさっぱり解らなかったりします。
              一時間ほど調べてみたのですが・・・難しい・・・

              intの分割を げんたさん にお願いしたくなってきました。

              ↓現状です
              class CDocLine
              (中略)
              void SetModifyFlg( bool ); // 2001.12.17
              bool IsModifyed ( void ); // 2001.12.17
              void SetBookMark ( void ); // 2001.12.14 hor ブックマークのON/OFFを切替える
              void SetBookMark ( bool ); // 2001.12.14 hor ブックマークのON/OFFを指定する
              bool IsBookMark ( void ); // 2001.12.14 hor ブックマークのON/OFFを取得する
              protected:
              bool m_bModify; // 変更フラグ
              bool m_bBookMark; // ブックマーク 2001.12.03 hor
              • [943] Re6:ssrc_2001-12-01_plus.lzh 実装修正 hor 2001年12月18日 00:00

                > intを区切るように変更します。

                ↓こんなかんじでしょうか?

                CDocLine.h
                ----------------------------------------
                -------
                bool IsModifyed ( void ) const;
                void SetModifyFlg( bool );
                bool IsBookMarked( void ) const;
                void SetBookMark ( bool );
                void SetBookMark ( void );
                protected:
                int m_nDocLineFlags;

                CDocLine.cpp
                ----------------------------------------
                -------
                bool CDocLine::IsModifyed ( void ) const {
                return m_nDocLineFlags & 0x1;
                }

                void CDocLine::SetModifyFlg ( bool bFlg ) {
                if(bFlg){
                m_nDocLineFlags |= 0x1;
                }else{
                m_nDocLineFlags &= ~0x1;
                }
                }

                bool CDocLine::IsBookMarked ( void ) const {
                return m_nDocLineFlags & 0x2;
                }

                (以下略)
                • [945] Re7:ssrc_2001-12-01_plus.lzh 実装修正 あろか 2001年12月18日 00:56

                  ▼ horさん
                  > > intを区切るように変更します。
                  こんばんは。
                  boolやBOOLのサイズは処理系依存なのであまり気にしないほうがよいと思います。
                  #BOOLだとVC4とVC6でも占有バイト数がちがうし。BCCはboolのサイズをオプションで変えられる。
                  intに押しこむのもソースがわかりにくくなりませんか?特に今回くらいだと、数バイトデータが減ってもその分コードが増えるのであまり効果ないのではないでしょうか。
                  • [946] Re8:ssrc_2001-12-01_plus.lzh 実装修正 hor 2001年12月18日 08:53

                    ▼ あろかさん
                    > こんばんは。
                    > boolやBOOLのサイズは処理系依存なのであまり気にしないほうがよいと思います。
                    > #BOOLだとVC4とVC6でも占有バイト数がちがうし。BCCはboolのサイズをオプションで変えられる。
                    > intに押しこむのもソースがわかりにくくなりませんか?特に今回くらいだと、
                    > 数バイトデータが減ってもその分コードが増えるのであまり効果ないのではないでしょうか。

                    こうゆうのってどんな言語でも悩むところですよね・・・
                    とりあえず、ビットの操作にかなり自信が無いので[942]の雰囲気で一度Upさせていただこうと思います。

                    ・・・仕事のスキを見つけて変更点を整理しますのでちょっと時間かかるかも
                    • [947] Re9:ssrc_2001-12-01_plus.lzh 実装修正 蛭子屋双六 2001年12月18日 10:15

                      ▼ horさん
                      > こうゆうのってどんな言語でも悩むところですよね・・・
                      > とりあえず、ビットの操作にかなり自信が無いので[942]の雰囲気で一度Upさせていただこうと思います。

                      コンパイラを限定することにもなるかもしれませんが
                      ビットフィールドを使うのはどうでしょう?

                      struct mybitfields
                      {
                      unsigned short a : 4;
                      unsigned short b : 5;
                      unsigned short c : 7;
                      } test;

                      こんな風に書けばただの構造体、もしくはクラスのメンバの一つとしてビット単位で操作できます。
                      確かgccは対応していたはず。VCは今ヘルプを見たら書いてあったので対応しているようです。
                      bccやlcc等、他のコンパイラはどうなんでしょう?
                      • [948] Re10:ssrc_2001-12-01_plus.lzh 実装修正 げんた 2001年12月18日 12:25

                        久しぶりです.そろそろ出てくることかと思っていました(笑).

                        ▼蛭子屋双六さん
                        >コンパイラを限定することにもなるかもしれませんが
                        >ビットフィールドを使うのはどうでしょう?
                        ビットフィールドは私も気づいていましたが,実は自分自身今まで一度も使ったことがなかったので敢えて黙っていました.自前でビット操作を行うよりもコンパイラの最適化が入る分だけ優れたコードが生成される可能性がありますかね.

                        ところで,ビットフィールドってCの標準仕様の一部かと思っていたのですが,コンパイラ依存なんですか?

                        --
                        とりあえず,サンプル.bccでコンパイルできました.

                        #include <stdio.h>

                        int main()
                        {
                        union A {
                        int x;
                        struct {
                        unsigned short a : 1;
                        unsigned short b : 5;
                        unsigned short c : 2;
                        };
                        };

                        A r;
                        r.x = 0;
                        r.a = 0;
                        r.b = 3;
                        r.c = 2;

                        printf( "%d (%X)\n", r.x, r.x );

                        return 0;
                        }

                        掲示板だとインデントが崩れちゃいます.ごめんね.
                        • [950] Re11:ssrc_2001-12-01_plus.lzh 実装修正 蛭子屋双六 2001年12月18日 13:32

                          ▼ げんたさん
                          > ところで,ビットフィールドってCの標準仕様の一部かと思っていたのですが,コンパイラ依存なんですか?

                          むかーし、ビットフィールドを使えないコンパイラを使ってました。
                          gccなら使えるのにー、と地団駄踏んでたんでよく覚えてます。
                          当時ですらかなり古くて、ANSIにすら準拠していなかったので当然かも知れませんが。

                          さすがに今はもう大概のコンパイラで使えるんですかね?
              • [944] Re6:ssrc_2001-12-01_plus.lzh 実装修正 げんた 2001年12月18日 00:45

                ▼ horさん
                > intの分割を げんたさん にお願いしたくなってきました。
                そこまで気合い入れてがんばらなくてもいいですよ。
                インターフェースさえアクセス関数にしておけば、データ構造は後から変更可能なので。

                その辺で適当にUPしてください。データの配置に注意すればサイズは現在と変わりません。

                ただ、bookmarkは複数種を扱えるといいと思っているので1bitのon/offのみというのも寂しいとは思いますけど。
                マークを利用して範囲指定というviみたいなことが出来ないかなあ。

                とりあえず、今年中にhorさんの変更を取り込んだものを正式版にしたいです。
                マイナーチェンジはその後でも出来ますので。
                • [956] Re7:ssrc_2001-12-01_plus.lzh 実装修正 hor 2001年12月18日 16:00

                  ▼ げんたさん
                  > マークを利用して範囲指定というviみたいなことが出来ないかなあ。

                  F6で範囲選択を開始して次(前)のブックマークへ飛ぶと、
                  ジャンプ前後の範囲を選択できますけど・・・

                  「マークを利用して範囲指定」ってどうゆう意味ですか?
                  • [957] Re8:ssrc_2001-12-01_plus.lzh 実装修正 げんた 2001年12月18日 16:20

                    >▼horさん
                    >「マークを利用して範囲指定」ってどうゆう意味ですか?
                    viではマークを行うときにそれに名前を付けておいて,マークaからbの間で置換といった指定ができます.でも普通のエディタでは意味無いか.範囲選択すれば済む話だし.

                    と思ったら,範囲選択開始→アウトライン解析→移動だと範囲選択が解除されちゃうのね.
                    範囲選択開始→検索→移動だと範囲選択の状態が保持される.
                    • [960] Re9:ssrc_2001-12-01_plus.lzh 実装修正 hor 2001年12月18日 17:04

                      ▼ げんたさん
                      > と思ったら,範囲選択開始→アウトライン解析→移動だと範囲選択が解除されちゃうのね.
                      > 範囲選択開始→検索→移動だと範囲選択の状態が保持される.

                      どちらの場合も「範囲選択が解除されちゃう」が再現しないのですが・・・私だけ?

                      別件ですが、F6→次を検索を繰り返してると選択状態がおかしくなる場合があるようです。