ノード対の「端点共有で始点不一致」エラー

多重カードを削減する基本的な方法は二つのカードを連結線で接続して片方のカードを削除することだ.このような連結線のうち,親から出て子どもに入るように見える親子連結線の水平部分をノード対と呼んでいる.これはノード対の両端に同一人名のカード(一方は可視,他方は不可視)が接続していることによる.ノード対の処理はZTシステムのコンポーネントの中でももっとも基本的なパートとなっている.

これらの水平連結線を交叉しない範囲でできるだけ簡潔に描画するというのはかなり難しい課題で,達成目標はベストエフォート(できる限り)ということになっているのだが,どうもあまりできがよくないので見直す必要が出てきた.おおまかな方針を決定し,すでに実装も進んでいるので,バグを潰しながら整理してゆくことにする.

NAMEBOX::makePairBoxでCheckSamePointの「端点共有で始点不一致」エラー.障害ノード対は#1226:#1099 雲井の雁(1)→#587 雲井の雁(0)と#1225:#1098 玉鬘(1)→#419 玉鬘(0)だ.⇒解決済

源氏物語全系譜6.1.ZELの傍系血族図の基準ノードを#13 春宮から#1光源氏に変えて,系統並び替えの冒頭でノード対リストのcancelを実行中,PAIRBOXの削除で参照カウントが負になった.⇒系統並び替えしなくても,アプリ終了だけで再現できる.⇒完全参照リスト管理をオンにしてテストしてみよう.⇒nodule::CheckSansyoで被参照カウント不一致が多発している.#34442 ノード対:蛍兵部卿宮の前の北の方(1)→(0)で参照元ノードリスト不記載,#34134 ノード対:玉鬘(1)→(0)でも同じエラーが発生している.これらは起動時にすでに発生している.LIST::bottomlistへの書き込みだ.PAIRLIST:swapで直接書き込んでいるためだろう.Bottomlist関数を使うようにした.

同上サンプルの全体図:#5 紫の上(若紫)でソートしてMakePairListCleanでループカウントオーバーになった.「最大区間ノード対の逆転」がPAIRBOX:#1492439:#1462069 致仕太政大臣の北の方(1)→#2449 (0)で起きている.親族図:傍系血族図 基準ノード=#5 紫の上(若紫)を開くと,NAMEBOX::makePairBoxでCheckPairBoxのエラーで停止する.⇒エラーを無視して描画は可能.全体図は問題なく開けた.紫の上の全体図を開いて,基準ノードを変えずに反復ソートしたら,3回目でMakePairListCleanの障害が出た.これは初期化が不完全ということを意味している.かなりまずい.

まず,先に最大区間ノード対の逆転がなぜ止まらないのかを見ておこう.PAIRBOX 蛍兵部卿宮の前の北の方(1)→(0)と競合しているが,これを端点共有と認定しているところが誤りだ.(3434, 3293)と(3434, 3293)で向きが逆になっている.⇒PAIRLIST::takeoutで共有解除,PAIRBOX::RepairCommonEndPointとPAIRBOX::MoveSamePointで共有を設定している.CheckCommonEndPointが間違った値を返している.⇒比較対象の矩形領域を正規化していなかった.

これで問題は解決したが,系統並び替えを反復すると動作が変化するというのはとてもまずいので,シューティングしておかなくてはならない.正規化すれば正しく動作するのだから,正規化しなくても動いているというのは,「たまたま」動いていただけと解釈するしかない.しかし,何がどうなっているとそのような動作になるのかを解析するのは難しい.類似のバグがまだ潜んでいる可能性はある.複数のバグが競合して動いたり動かなかったりということもありそうだ.⇒系統並び替えの冒頭で描画要素を完全にクリーンアップすることでソートを反復しても動作には変化が見られないようになった.

その上でCheckCommonEndPointの修正(比較対象矩形領域の正規化)を行うと,連結線のもつれはほぼ完全に消えた.これまでは端点共有と通常ノード対の区間交叉がかなり見られたが,一見したところ見当たらなくなった.EraseTreeViewで行っている描画要素のクリーンアップは多少時間コストは掛かるが,これを実行しておけば間違いはない.

類似した関数にInitTreeViewというのがあり,修正履歴では「InitCoupling>InitTreeViewを廃止@20201208 余分な処理になっている → FIXED@20201209」となっているので,多分使わなくてよいのではないかと思う.この関数は,現在,①FAMILYTREE:callSendCard,②FAMILYTREE::getNewCardで使われている.

「InitTreeViewをCOUPLINGのコンストラクタに移動@20170731」というコメントもあるが,COUPLING()では「ここではTREEVIEWの初期化は実行しない@20170804」となっている.⇒タイトル枠を初期化しているのが気になるが,各種フラグのリセットなどをやっているので,実行しておいた方がよいと思う.

▲源氏物語全系譜6.1.ZELの全体図を#18 左兵衛督でソートしてNAMEBOX::makePairBox→ PAIRBOX::CheckPairBoxエラーが出た.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA