雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
1: 2007-02-18 (日) 15:53:20 ソース バックアップ No.1 を復元して編集 2: 2007-02-18 (日) 18:33:27 ソース バックアップ No.2 を復元して編集
Line 2: Line 2:
-*gcc3 [#t225473e] +*gcc3,4 [#t225473e] 
-** [#ga540f14]+-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; } 
 +                                   ↑ 
 +                                 キャストそのものをはずしてしまった 
 + 
 + 
 +*gcc4.2 [#hb03bb80] 
 +-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) not 0x03