☆ワンダーウィッチ 《コンパイルエラー回避法》

今回の開発は、他の携帯機器で完成したプログラムを移植する事が目的です。
そのソースをコンパイルしたのですが、強烈なエラーが(泣)
他にも同様のエラーに悩まされる人がいると思うので、ここに理由や回避方法を記述します。

○コメントに //が使えないエラー
rw.c 6: syntax error near '/'
rw.c 6: illegal character

LSI C-86では //コメントがデフォルトでは使えません。
c:\WWitch\lsic86ww\bin\_lcc86ww
ファイルをエディタで開いて、先頭に -Bオプションを追加して下さい。

# _lcc86ww: configuration file of LSI C-86 for WonderWitch on Windows
-B
-DLSI_C_WW -DLSI_C -O
〜〜〜

こんな感じです。

○入れ子が深すぎるエラー
rw.c 1688: too nested compound statement

簡単な判断基準として、字下げ位置が15段を超えると出力されます。
みなさんちゃんと字下げして書いていますよね?

少なくとも、下記関数が対象のようです。
・if
・switch

このエラーの対処方法として、2つあります。
1.AND条件で比較する
これは、例えば、

if(a == 0){
  if(b == 0){
    //処理
  }
}

と書いている場合、

if(a == 0 && b == 0){
  //処理
}

にすると言うものです。
「見易くなるように記述していたのに!」と言う人が多いと思いますので、下記のように記述するのが良いと思います。

if( a == 0
 && b == 0){
  //処理
}

2.関数を分ける
これは、条件文の一部を別関数に置き換えるものです。

if(a == 0){
  //処理
  if(b == 0){
    //処理
    if(c == 0){
      //処理
    }
  }
}

の場合、1のような AND置き換えは簡単には行えません。
そこで、

void bc(void){
  if(b == 0){
    //処理
    if(c == 0){
      //処理
    }
  }
}

if(a == 0){
  //処理
  bc();
}

のように、関数にしてしまいます。
こうすると、3段であった入れ子が、2段と1段に分けられました。

○ヒープメモリが不足しているエラー
C:\WWitch\lib/crt0jpn2.obj(crt0jpn2), TEXT+0x0027: Overflow (word): HEAP

このエラーはメモリ確保をし過ぎているというエラーです。
とりあえず、まだ使っていなかったら farを使ってみましょう。

char far XXX[5000];
のように、farを入れるだけです。

○データが大きすぎる
C:\WWitch\lib/crt0jpn2.obj(crt0jpn2), TEXT+0x001A: Overflow (word): BSS
rw.obj(rw.c), TEXT+0x00D1: Overflow (word): BSS
C:\WWitch\lib/libww.lib(rand.ASM), _TEXT+0x00AC: Overflow (word): DATA

これらのエラーは出た時は腐る程出力されます(^^;
データが大きくなってしまう原因は2つありました。

1.コンパイラのバグ(?)
全く同じデータをコンパイルしても、サイズが10倍以上異なる事がありました。
一度ソースを開いて保存し直すと直りました(謎)
この事象を見分ける為には、分割コンパイルしてみると良いでしょう。

2.本当に大きすぎる
ウィッチで扱えるデータは、メモリを考えると 64KBが限界です。
そこへ、const unsigned char XXX[]{ 64KB以上のデータ}; などとするとエラーになって当然です。
そう言うときは、別ファイルにして読み込むようにしましょう。

○用意されていない標準関数がある(1)
rw.c 1479: Warning: function 'atoi' undefined -- assumed to be int

文字を数値に変える便利な関数 atoiが実装されていません。
ANSI Cぐらい実装できないのでしょうか?

○用意されていない標準関数がある(2)
rw.obj(rw.c): Undefined symbol: _toupper
rw.obj(rw.c), TEXT+0x4022: Too far (different segment): _toupper

文字を大文字に変える便利な関数 toupperが実装されていません。
ANSI Cぐらい実装できないのでしょうか?


トップメニュープログラマ専用ワンダーウィッチ