雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。

gccのエラーを翻訳してみて対処をお勉強してみるスレ?

gcc3,4 anchor.png

  • ISO C++ forbids cast to non-reference type used as lvalue
    コード
    void Release(void){ DELETEPTR_SAFE((unsigned char*)lpMdlAdr); dwMdlSize=0; lpMdlPos=NULL; }
    • ISO規格のC++では、左辺をキャストして代入するのはダメって意味らしい。
    • 対処は、ちゃんと右辺側でキャストしなさいってことらしい。
    • 右辺? でもこれ、ヘッダファイル内での関数宣言だんだよなぁ。右辺も左辺もないんじゃ・・・???
    • とりあえずゴマカシで、キャストそのものをはずした。コンパイルや動作はとりあえずは動いているみたいだけど気持ち悪いし心配・・・(別のエラーも出るし)
      void Release(void){ DELETEPTR_SAFE(lpMdlAdr); dwMdlSize=0; lpMdlPos=NULL; }
                                         ↑
                                       キャストそのものをはずしてしまった
Page Top

gcc4.2 anchor.png

  • lvalue required as left operand of assignment
コード
current_binding_level = newlevel;
    • 左辺の値は変更可能でないといけないって意味らしい。
    • 左辺すなわちcurrent_binding_level。これはなにかというと・・・
      #define current_binding_level                   \
        (cfun && cp_function_chain->bindings          \
         ? cp_function_chain->bindings                \
         : scope_chain->bindings)
    • こんなことしてあった。なんじゃこれ? 構造体??
    • #defineって、文字の置き換えだよね?。えぇ? でもさ、なんで括弧があるの?それに、置き換え後の値も定義されてないじゃん・・・・
      普通のdefine
      #define aaa 123      <-aaaと書かれたらコンパイル時に123に置き換えろ!
      
      x = aaa + 456;       --->コンパイル時には置換される-->  x = 123 + 456;
    • そうすると、あそこを素直に考えると
      current_binding_level = newlevel;
                          ↓
      (cfun && cp_function_・・・略・・・pe_chain->bindings) = newlevel;
    • こうなるわけ??? なんじゃ?こりゃ???
    • あっれ? 難しく考えすぎてたかな??。これ、単なる計算式じゃない??
        (cfun && cp_function_chain->bindings          \
         ? cp_function_chain->bindings                \
         : scope_chain->bindings)
                         ↓
                ちょっと長くなるのでcp_function_chainをCFCと書く
                         ↓
        (cfun && CFC->bindings ? CFC->bindings : scope_chain->bindings)
    • で、この?と:って条件演算子じゃないの??。そうするとさ、こういうふうにならない?
      if(cfun && CFC->bindings) {
          CFC->bindings;
      } else {
          scope_chain->bindings;
      }
    • ぐはぁ! これなら意味は通じるぞ!。これで合ってるのかな???
    • ・・・じゃあさ、じゃあさ!! エラーがでるあの部分って、こういうふうに書き換えればいいってこと??
      コード
      current_binding_level = newlevel;
                            ↓
      if(cfun && CFC->bindings) {
          CFC->bindings = newlevel;
      } else {
          scope_chain->bindings= newlevel;
      }
  • static declaration of 'tek1_s7ptr' follows non-static declaration
    コード
    static UCHAR *tek1_s7Ptr;
    • ふむ・・・変数tek_s7ptrの宣言をしていると・・・
    • もしかして、変数tek_s7ptrの宣言に矛盾があるとかそういうことかな??
    • 調べてみた。なるほど。たしかに。
      extern UCHAR *tek1_s7ptr;    ←39行目
      
      static UCHAR *tek1_s7Ptr;    ←4746行目
    • このズレが問題らしい。そうなると、どちらかに統一するのがスジだけど、どっちにあわせたらいいのかなこれ???
    • 変数の定義をいろいろ調べてみた。externは、「この変数はヨソでも定義されているよん」という意味。staticは「この変数はここが終わってもずっと保持してね」という意味だ。
    • ・・・えぇぇ? じゃどうすればいいの??これ??
    • まてよ? 39行目でexternで宣言されているけど、このプログラムって他のものをインクルードしたりしないよね?。そう考えると、そもそも39行目でこういうふうに宣言しておく必要ってあるのかな??
    • そんなわけで、4746行はコメントアウトし、39行目をstaticに変更。(合ってるかなこれで・・・)
  • ((int) p) &= ~0x03;
    • たぶん型キャストに問題がある。左辺はキャストしちゃいけないはず。
    • たぶんこんな型キャストしてるということは、pはintじゃない。で、~0x03がintなんだろうと思われる。
      void tek1_btseek(struct TEK1_STR_BTBUF *btbuf, UCHAR *p)
      {
             int bit = (((int) p) & 0x03) << 3;
             ((int) p) &= ~0x03;
             btbuf->rest = 32 - bit;
             btbuf->buf0 = (*(unsigned int *) &p[0]) >> bit;
             btbuf->buf1 &= 0;
             btbuf->ptr = (unsigned int *) &p[4];
             return;
      }
  • やっぱり。UCHAR *p ってことは、pは「アドレス変数」ということになる。
  • つまりここは、分解してちゃんと書くと、こういう意味になるはず。
    ((int) p) &= ~0x03  →  ((int) p) = ((int)p) & ~0x03  ->  ((int) p) = ((int)p) & ~0x03
  • ・・・ということは、こうすればいいのかな???
      p = (UCHAR *)((int)p & ~0x03)
  • ふむ〜。たぶんこれでいけるかも〜。

Last-modified: 2012-10-22 (Mon) 22:05:11 (GMT) (2818d) by