「坪」を変換できるようにする
「坪」の選択肢を追加しましたが、「坪」と他の単位との間で値を変換できるようにはまだなっていません。ですが、とりあえずは、いま出ている実行時エラーを直しましょう。
実行時エラーの原因を探す
さて、ここまでのコードをデバッグビルドして実行してみると、次の画像のように実行時エラーになってしまいます。その例外を出しているのはassertマクロで、その評価式を見てみると、idが166のとき(すなわち、「坪」のとき)、conversionFactorがゼロ(または負)になっているというのです。
エラーが出た行のassertマクロは、デバッグビルド時のみコンパイルされます。ここを書いたプログラマーが、「この時点でconversionFactorが正の値になっていなければならない」ということを宣言しているのです。ゼロのまま実行していくと、いずれは"divide by zero"(ゼロ除算)例外が出るという意味のコメントが付けられています。
このassertマクロが書かれていなければ、実行し続けるうちにゼロ除算例外が出ることになり、そこからのデバッグはおそらく困難なことになるのでしょう。わざわざassertマクロが書かれているということは、この近くに原因があるはずだということです(あるいは引数に問題があるかですが、ここで問題を起こしたconversionFactor変数は引数ではありません)。
問題を起こしたconversionFactor変数がどのように生成されたのか、コードを少しさかのぼってみましょう(次の画像)。
conversionFactor変数の変遷を探る(UnitConverterDataLoader.cpp) 問題のconversionFactor変数(ピンク色の背景)は、unitConversions変数(オレンジ色の背景)から取り出されました。そのunitConversions変数は、categoryToUnitConversionDataMap変数(灰色の背景)から取り出されています。そして、categoryToUnitConversionDataMap変数は、GetConversionDataメソッドで初期化されているようです(行番号75)。
そのGetConversionDataメソッドを見てみましょう(次の画像)。あ、ここで面積の換算率を定義しておかないといけないようですね。
GetConversionDataメソッドの冒頭部分(UnitConverterDataLoader.cpp)