''[[C++/Tk/バグ対応]]''
* C++/Tkで、coordsの取得時にエラーとなる [#z8b45d22]
今回は以下のように、アイテムの持つ座標を取得しようとした時のバグに対応したい。
 Box coords( ".c" << coords( active ) );
コンパイルは通るが実行時エラーとなる。~
原因はTcl_GetIntFromObj()の失敗である。~
APIにおいて、Tclコマンド実行結果としてのオブジェクトから、整数型のデータを取得できていない。~
まったく同じ原因によって、例えばcanvasx(y)でも実行時エラーが発生する。
 //int cx = ( ".c" << canvasx( vd_x, GRID_H ) );                //  グリッド付加と座標の取得 *実行時エラー*       //
 //int cy = ( ".c" << canvasy( vd_y, GRID_V ) );                //  グリッド付加と座標の取得 *実行時エラー*       //
 double cx = ( ".c" << canvasx( vd_x, GRID_H ) );               //  グリッド付加と座標の取得 *実行OK*             //
 double cy = ( ".c" << canvasy( vd_y, GRID_V ) );               //  グリッド付加と座標の取得 *実行OK*             //
これらのTclコマンドは実数型を戻し、APIの方で整数型に対応していないのではないかと考えている。~
開発環境に依存した問題かも知れないが、いずれにせよ対応は必要。~
きれいに解決するのであればdouble版のBox構造体を用意する等考えるべきだが、応急処置としては以下のように変更を加える。

** 制約事項 [#pacc9c63]
cpptk-1.0.2およびboost_1_34を使用。~
~
~
ファイル名:cpptkbase.cc L:571~
 /* This is OK for me ******************************************//*  Boxを使ったcoords取得時バグ対応               */
 details::Expr::operator Tk::Box() const
 {
     string ret(cmd_->invoke());
     if (ret.empty())
     {
          return Tk::Box(0, 0, 0, 0);
     }
     
     int len = getResultLen();
     if (len < 4)
     {
          throw TkError("Cannot convert the result list to Box\n");
     }
     
 //  int x1 = getResultElem<int>(0);                            //  Tcl_GetIntFromObj()でエラーとなるため変更     //
 //  int y1 = getResultElem<int>(1);                            //  Tcl_GetIntFromObj()でエラーとなるため変更     //
 //  int x2 = getResultElem<int>(2);                            //  Tcl_GetIntFromObj()でエラーとなるため変更     //
 //  int y2 = getResultElem<int>(3);                            //  Tcl_GetIntFromObj()でエラーとなるため変更     //
 //                                                             //                                                //
 //  return Box(x1, y1, x2, y2);                                //  Tcl_GetIntFromObj()でエラーとなるため変更     //
     int x1 = (int)(getResultElem<double>(0) + 0.5);            //  Tcl_GetDoubleFromObj()の戻り値四捨五入で対応  //
     int y1 = (int)(getResultElem<double>(1) + 0.5);            //  Tcl_GetDoubleFromObj()の戻り値四捨五入で対応  //
     int x2 = (int)(getResultElem<double>(2) + 0.5);            //  Tcl_GetDoubleFromObj()の戻り値四捨五入で対応  //
     int y2 = (int)(getResultElem<double>(3) + 0.5);            //  Tcl_GetDoubleFromObj()の戻り値四捨五入で対応  //
                                                                //                                                //
     return Box(x1, y1, x2, y2);                                //  Tcl_GetDoubleFromObj()の戻り値四捨五入で対応  //
 }
 //*This is OK for me ******************************************//*  Boxを使ったcoords取得時バグ対応               */


*** 修正履歴 [#vce4ef7b]
~

*** 課題 [#sc4098cb]
~

-備考~
どうなんすかねぇ〜。~
Tcl_GetDoubleFromObj()とTcl_GetIntFromObj()のどちらを使うのって話です。~

*** 参考ページ [#b6f99754]
[[C++/Tk:http://cpptk.sourceforge.net/]]~
[[Tcl API一気に流し読み:http://www.geocities.co.jp/SiliconValley/4137/dir4/tapi25.html]]~

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS