1: 2007-02-18 (日) 20:49:42 |
現: 2024-01-06 (土) 22:39:12 |
- | [[gcc_error]] | + | 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] |
| + | -さてー。そんなわけでコンパイルができました。さてこれではりぼては動くか? |