''[[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]]~