2012-02-22 1 views
1

私は新しいTCL_ObjTypeを作成していますので、setFromAnyProc、updateStringProc、dupIntRepProc、freeIntRepProcの4つの関数を定義する必要があります。コードをテストするときは、面白い/謎があると思う。私は次の操作を実行したときに、私のテストコードでTCL/C - setFromAnyProc()がいつ呼び出されるのですか

、:と呼ばれる新しいTCLオブジェクトの

Tcl_GetString(p_New_Tcl_obj); 

updateStringProc()、私はGDBでそれを見ることができますが、これが期待されています。

Tcl_SetStringObj(p_New_Tcl_obj, p_str, strlen(p_str)); 

私はsetFromAnyProc()が呼び出され期待し、そうではありません。

奇妙なことは、私は、次のテストコードを実行するときです!

私は混乱しています。なぜ呼び出されないのですか?

+0

私は多くの質問をしました。それらのうちのどれかがあなたの満足に答えられましたか?それらの横の中空のチェックマークをクリックすると、正しいと思われる回答に印を付けてください。 (ちょっと一目でわかるように、 'std :: vector'のメモリ管理やループのインクリメントには十分に答えられています。) –

答えて

0

setFromAnyProcは、あなたが考えるほど有用ではありません。値の[*]を、入力したbytesフィールドの値から、入力されたbytesフィールドと有効なinternalRepおよびtypePtrのフィールドに変換することです。 を特定のフォーマットに変換することが必要なときに呼び出され、特にTcl_ConvertToType関数の中核です。あなたはおそらくそれを使用していないでしょう。 Tcl自体は確かにしません!それぞれintタイプのアクセッサです

それはあなたが変換をしたいポイントは(TclのAPIは、例からTcl_GetIntFromObjTcl_ListObjAppendElementが含まタイプ固有のアクセサまたはマニピュレータの機能であることがわかったので、これは、[ **]とlistタイプのマニピュレータ)。その時点で、その特定のタイプの内部構造の詳細を知る必要があるコードになっているので、汎用変換を使用してもそれほど有用ではありません。必要に応じて変換を直接行うことができます変換関数)。 (Tcl_InvalidateStringRepを通じて、あるいはむしろその内部のアナログ)古いbytes文字列表現を処分した後、あなたが提供した新しいbytesをインストールし、(freeIntRepProcコールバックで)あなたのオブジェクトの内部表現を捨てることで

Tcl_SetStringObj作品。

私はTcl_ObjTypesetFromAnyProcフィールドをNULLのままにしておくことができますが、問題はありません。


[*] Tcl_Objタイプは、歴史的な理由でミスという名前です。それは価値です。 Tcl_Valueは今では時代遅れで、事実上使用されていない何かのために撮影されました。
[**]整数は実際には必要なビット数に応じて内部型のクラスターで表されます。アクセサー関数が複雑さを完全に隠すので、詳細を知っている必要はありません。

関連する問題