初期フェーズおよび,系図木のトポロジーに何らかの影響を与えるような操作が行われたときのフェーズの遷移にはかなりあいまいなところがある.それぞれのフェーズに入るための要件,およびそこから次のフェーズに遷移するための条件,つまりフェーズの境界を決定する,言い換えれば各フェーズの定義を確定する必要がある.
アプリ起動時のフェーズはデフォルトでGROUNDZEROだ.これは「更地」であるということを意味する.次のINITIALSTATEは「初期状態/ファイルクローズ時の状態」と定義されている.これまでの考察に鑑みると,INITIALSTATEではコア系図木(ZTシステムのコアブロック)が存在することが要件になると考えられる.コア系図木は以下の一行で自動的に構築されるものでなくてはならない.
Coupling = new ((nodule*)&Coupling, SEIZEGROUND) COUPLING;
COUPLING Couplingは系図木(ZT系図システム)の頂点を成すオブジェクトであり,その直下のオブジェクトはCOUPLINGのコンストラクタ内で生成される.また,これら直下オブジェクトの直下オブジェクトはそれぞれのコンストラクタの中で生成されるから,コア系図木は上記の一行が実行された時点で確立されなくてはならない.また,ファイルがクローズされた時点では再びこの状態に戻っていなくてはならないと考えられる.そうなっているかどうかを(実際にはそうなっていないと思われる…)確認してみよう.現状ではCallSetCouplingPtrの入口の系図木は以下のオブジェクトから構成されている.
番号 個数 CID クラス名
# 1 1 & COUPLING ◯
# 2 1 F FAMILYTREE ◯
# 3 1 J LINKTABLE ☓
# 4 1 K KAKEIZU ◯
# 5 13 L longtable ▲ 12個不足
# 6 1 N NAMESORT ☓
# 7 1 P PARTIALNAME ☓
# 8 1 T TOPOLOGY ☓
# 9 1 U UNDOSYSTEM ☓
# 10 1 W TITLELINK ◯
# 11 1 c CARDTABLE ☓
# 12 1 f GENELIST ☓
# 13 1 h LIST ☓
# 14 2 l nlist ☓
# 15 1 q PAGESETUP ◯
# 16 1 u TRASHCAN ◯
# 17 1 v TREEVIEW ◯
# 18 1 y MARGTABLE ☓
# 19 1 z TRIBELIST ☓
クラス名で19,オブジェクトの個数32というのが,コア系図木を構成する基本的なコンポーネントだ.一方現状でCouplingを生成した時点ではクラス数で11,オブジェクト数で16しかない.この中には以下のような,①nodule x 4,②TITLEBOX x 1,③NODEREFLIST x 3など上記に含まれないものも入っているので,欠けているオブジェクト数は16個よりも大きい.欠けているものはほとんどFAMILYTREEの下位オブジェクトなので,まずこれらを追加してみよう.
現行ではこれらはFAMILYTREE::InitializeFamilyTreeで生成しているので,FAMILYTREE()からそれを呼び出すようにしておこう.⇒TOPOLOGYが生成され,TOPOLOGY::initializeでエラーが出た.TOPOLOGY::baselistの初期化のためにTREEVIEWが必要になっている.世代枠リストというのは描画に関係するものなので,描画リストの先頭が必要になってくる.この意味では基本世代枠リストはTREEVIEWの下にある方が自然であるような気がする.
実際系列世代枠リストは系列枠自身が管理している.この見直しは後からやることにして,ここではTREEVIEW空で停止しないようにしておこう.実際,ABSTRUCTTREEのときにはTREEVIEWなしでも動作するようになっている.TOPOLOGY::SetPhaseでも同様エラーが出るが,無視しておこう.これでCOUPLINGの生成時のオブジェクト数は46,クラス数で23となり,コア系図木より大分大きな木になってしまった.
余分なものとしては,nodule x 2,SIMPLEGRAPH x 9,TITLEBOX x 1,NODEREFLIST x 2がある.SIMPLEGRAPH をコアに含めてしまってもよいが,ない方がすっきりするので,生成しないようにしてみよう.⇒これらはTOPOLOGY::initializeで生成されている.TITLEBOXはTITLELINK()で生成されている.これも止めておこう.
どこかで「参照」が生成されている.コア系図木では参照を使わないということになっているので,どこで発生しているのか調べてみよう.TITLELINK→TREEVIEWという参照がTREEVIEW()で設定されている.TITLELINKはコア系図木に含まれているので,参照スロットを廃止して関数でアクセスするようにしておこう.
TITLELINKは現在TREEVIEWが管理するようになっているが,あまりよくないと思う.タイトルというのは系図データの一部であり,必ずしも描画と直結している訳ではない.⇒暫定的に現状で進めることにする.⇒これでCOUPLING生成時とCallSetCouplingPtr入口で完全に一致するコア系図木を持てるようになった.
次に確認すべきことはファイルをクローズした状態がこのコア系図木になっているという点だ.アプリ終了時にはファイルをクローズしているはずだから,おそらく間違いはないとは思われるが… その前にどこかでグラフを生成しておかなくてはならない.⇒TOPLOGLY:GenerateGraphsという関数を作って,COUPLING::OpenFamilyBaseから呼び出すようにした.
▲系統並び替えの冒頭,BuildGeneListでdomainが空というエラーになる.世代枠が生成されたときにTREEEVIEWがまだ生成されていないためだ.⇒暫定的にCOUPLING()でFAMILYTREEとTREEVIEWの生成順を入れ替えた.⇒うまくいった.
COUPLING::CloseFamilyBaseを実行後のコア系図木がデフォルトと完全一致していることを確認した.これでGROUNDZEROとINITIALSTATEの状態は確認できた.逆に言うと,フェーズをINITIALSTATEに切り替えできるのは,①COUPLINGの生成後と②ファイルクローズの2つしかないということになる.これ以外の場所で設定しているとすればそれは誤りだ.確認してみよう.現在INITIALSTATEを設定している場所は9箇所(関数名では6)ある.
- FAMILYTREE::callSendCard カードデータの更新 → INITIALIZED
- COUPLING::TopologicalSort 系統並び替えで例外発生 → アプリ終了
- COUPLING::EraseFamilyTree EraseFamilyTreeの入口 → 出口でINITIALSTATE
- FAMILYTREE::InitializeFamilyTree 下位コンポーネント生成後 → 不用
- FAMILYTREE::getNewCard 新規カード生成で失敗 → INITIALIZED
- COUPLING::OpenFamilyTree ファイルオープンで例外 → アプリ終了
カードデータの更新や新規カード生成では系統並び替え直前のINITIALIZEDでよいのではないかと思う.例外が発生したときはとりあえず,アプリ終了するものとしておこう.InitializeFamilyTreeはCOUPLINGのコンストラクタから呼び出されるだけだから,何もしなくてよい.EraseFamilyTreeの動作は,CloseFamilyBaseの主要部分を占めると思われるのでその出口でINITIALSTATEとするのでよいのではないか?EraseFamilyTreeが「解体」の主要パートを実行しているが,CloseFamilyBaseではまだフェーズはDRAWSTAGEのままなのであちこちで検査に引っかかってしまう.⇒暫定的にEraseFamilyTreeの入口でCHAOTICSTATE=INITIALIZEDまで落とすようにした.
これで大体筋が通ったのではないかと思う.ENDOFAPPLICATIONではゴミ箱を廃棄してCouplingをdeleteする.コア系図木は new…COUPLINGで生成されているので,delete Couplingで始末するというので首尾一貫している.INITIALSTATE→ INITIALIZING→ INITIALIZEDの辺りをもう少し詳しくみてみよう.
アプリを起動すると,アプリ側ではファイルをオープンする前に「デフォルト画面設定を取得する」ということをやっている.このとき,COUPLING::InitCouplingが実行され,その中からTREEVIEW:InitTreeViewが呼び出されている.しかし,ここで設定された参照はファイルオープン前に実行されるファイルクローズによってクリアされてしまうので,ほとんど意味のないことをやっているように思われる.
上記修正は通ったが,アプリ終了時にエラーが出るようになってしまった.新設したオプションを止めても変わらない.どこか壊してしまったのではないかという気がするが,今日は一度もバックアップを取っていない… ともかく一度バックアップを取ってから追いかけることにする.
▲ZTシステム構成図7.ZELの全体図を#1 couplingで開いて終了して,nodule::Disposeで空でないスロットがあるというエラーになった.障害ノードは#10 CARDTABLEでlongtable *lookupが残っている.CARDTABLEは独自のスロットを持っていないが,基本クラスのBASETABLEのデストラクタには以下のようなコメントが付いている.
2017-07-27 スロットを全クリアする×→スロット配列のみクリアする
全クリアするように修正して解消した.20201127にClearTableに関係してARRAY<bnum>::CleanSlot();を追加する修正を行っているが,このときに何か勘違いして余分なことをやってしまったのではないかという気がする.不審なのはなぜ,この誤りがいままで発現しなかったのか?という点だ.現行ではすべてのlongtableはコア系図木の一部として最終段階まで維持されるが,従来論理ではどこかで削除していた可能性もなくはない… ともかくこれで一件落着したことにしておこう.
COUPLING::CloseFamilyBaseとCOUPLING::EraseFamilyTreeは引数を持っているが,つねにTRUEで動作しているので,廃止してしまおう.EraseFamilyTreeの場合,modeがONでは以下が実行される.
- delete familytree->undosys
- delete topology
- familytree->CleanSlot()
このモードはアプリ終了時に一度だけ実行されるようになっているが,現行ではそれに代えてdelete COUPLINGでコア系図木を根こそぎ切り倒すようになっているので,不用と考えてよい.⇒対処した.
ABSTRUCTTREEというグローバル変数がある.これは「ファイルの追加読み込み」を実行するとき,描画要素を持たない系図木を構築するためのオプションだが,これをONにして起動したらどういうことになるのか,ちょっと見てみたい.⇒これは流石に簡単には収束しそうもない.一旦中止した方がよさそうだ.