C++/Tk/バグ対応

C++/Tkで、coordsの取得時にエラーとなる

今回は以下のように、アイテムの持つ座標を取得しようとした時のバグに対応したい。

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構造体を用意する等考えるべきだが、応急処置としては以下のように変更を加える。

制約事項

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取得時バグ対応               */

修正履歴


課題


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

参考ページ

C++/Tk
Tcl API一気に流し読み


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-08 (月) 02:08:08 (5184d)