2: 2007-02-18 (日) 20:56:35 |
現: 1970-01-01 (木) 18:00:00 |
- | gcc4でtolsetはコンパイルできるのか!? | |
| | | |
- | とりあえず、これまでやっていたgcc3系列のパッチを当てたソース。こいつをgcc4でコンパイルできるかどうかやってみる! | |
- | | |
- | ''※''ウチの実験はFreeBSDのgcc4.2で行いました。 | |
- | | |
- | | |
- | *go_0023s [#lfc22ed7] | |
- | -順調にコンパイルが進んでいたけど、やっぱり出た!エラー! | |
- | -cp/内のdecl.c内で、以下のエラーが大量に! | |
- | - 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; | |
- | } | |
- | | |
- | | |
- | | |
- | *bim2bin [#dd3248bd] | |
- | -でました。エラー。 | |
- | - ((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) | |
- | | |
- | -ふむ〜。たぶんこれでいけるかも〜。 | |
- | | |
- | | |
- | *コンパイル完了! はたして!! [#t1591ead] | |
- | -さてー。そんなわけでコンパイルができました。さてこれではりぼては動くか? | |