「ABSTRUCTTREEを試してみる@20201208」は無謀な試みだった

「ABSTRUCTTREEを試してみる@20201208」という修正は収束の見込みが立たないので,一旦中止して昨日のバックアップに戻った.2回目のバックアップは「ABSTRUCTTREE」以前の修正はすべて入っているので手戻りは生じない.ここで一度ここまでの修正をすべて現状でフィックスしておくことにする.以下のコンパイルオプションがある.

  1. FAMILYTREE:Initializeを廃止する@20201208 3箇所
  2. COUPLING()でコア系図木を生成@20201208 13箇所
  3. フェーズの遷移を整理する@20201208 9箇所
  4. InitCoupling>InitTreeViewを廃止@20201208 1箇所
  5. CloseFamilyBaseの引数を廃止@20201208 5箇所
  6. EraseFamilyTreeの引数を廃止@20201208 2箇所

修正完了した.今日は始業時バックアップを取っていないので,バックアップしておこう.気になる点が2つある.①baselist(基本世代枠リスト)をTREEVIEWの下に移動する,②TITLELINKをTREEVIEW以外の位置に移動するの2点だ.それほど大きい修正にはならないと思うのだが… 現行ではbaselistはTOPOLOGYが管理している.

「baselistをTREEVIEWに移動@20201209」の修正を行っているところだが,急にマイクロソフトの複数のヘッダファイルでエラーが出始めた.原因は全くわからない.エラーが出ているのはcorecrt_io.h, mmsystem.h, mmiscapi.hなどで大量のコンパイルエラーが出る.修正を戻しても状況はまったく変わらない.HD,RAM,CPUなどの資源が逼迫しているようにも見えない.おそらく,状況はバックアップに戻っても変わらないのではないかと思う.

一度リブートしてみることにする.⇒バックアップは問題なくビルドできた.仕掛り版をビルドしてみよう.⇒やはりエラーが出る.TableSort.cppのコンパイルでmmiscapi.hがエラーを出している.「構文エラー: ‘;’ が ‘*’ の前にありません。」や「型指定子がありません – int と仮定しました。」,「’pchBuffer’: 不明なオーバーライド指定子です」などだ.もう一度作り直してみよう.

TablelSort.cppには以下の5つの外部ヘッダファイルがインクルードされていたが,現在はまったく参照されていないのですべて廃止とする.shlobj.h,tchar.h,string.h,timeapi.h,corecrt_io.h.「baselistをTREEVIEWに移動@20201209」の修正は完了した.COUPLING()でFAMILYTREEとTREEVIEWの生成順を元に戻しても動作することを確認した.TITLELINKは現在TREEVIEWの下にあるが,これは描画要素ではないので,FAMILYTREEに移動する.⇒完了した.

ただし,FAMILYTREEへの移管というのは失策だったかもしれない.FAMILYTREEは実際のところ,ほとんどタイトルに関与していない.むしろ,COUPLINGの方が関わりはある.これから再修正というのもなんであるし,現行ではタイトル枠の表示自体が不調なので,それに掛かるときに再考することにしよう.

フェーズの遷移についてもう少し調べてみよう.INITIALSTATE≡コア骨格木であるということが明らかになった.ではINITIALIZINGとINITiALIZEDでは何がどう違うのか?この2つのフェーズはどちらもCOUPLING::InitLinkTableの中で遷移している.この関数はCOUPLING::ReadFamilyBaseの中でデータベースを読み込んだ直後に実行される.INITIALIZINGに遷移する地点ではノード数はコアの32から73まで増えているが,まだ参照は1件も発生していない.これに続くループで結婚リンクとカードリンクが初期化されて描画要素が生成され,それに従って参照が発生する.つまり,INITIALSTATE→ INITIALIZINGは参照ゼロの区間と言える.

INITIALIZINGにはInitLinkTableの中で遷移しているが,むしろReadFamilyBaseの中でreadFamilyBaseが完了して,InitLinkTableの実行に移るタイミングで切り替えた方がわかり易いと思う.同様に,INITIALIZEDもInitLinkTableの中で遷移するのではなく,ReadFamilyBaseの出口で設定するという方がわかり易いのではないか?INITIALIZEDというのはTOPOLOGICALSORT待ちという状態であり,INITIALIZED→TOPOLOGICALSORTの間は空白であってよいと思われる.⇒いや,フェーズの遷移はもっと上のレベルで実施した方がよい.フェーズの遷移はすべてCOUPLING::OpenFamilyTree上で見えるようにしてみよう.このためにはOpenFamilyBaseを少なくとも2つの部分に分解しなくてはならない.というか,そのためにはReadFamilyBaseを2つに分解しなくてはならない.

大体目処が付いた.OpenFamilyBaseを分割するというのはさすがにやり過ぎだろう.OpenFamilyTreeではCloseFamilyBaseも呼び出しているので,OpenFamilyBaseとCloseFamilyBaseを同レベルで扱うのがよい.CloseFamilyBaseの出口でINITIALSTATEになり,OpenFamilyBaseの出口でINITIALIZEDになるというのが一番バランスがよいと思う.コードを見易くするために,ここで一度オプションをフィックスしておこう.⇒まずい.PARTIALNAME::Entry2ListNumでエラーが出るようになってしまった.⇒修正「フェーズ遷移はOpenFamilyTreeで行う@20201209」を戻したら収まった.

COUPLING::ReadFamilyBaseで使っているローカル変数を分離して外に出したパートに渡さなくてはならない.⇒KAKEIZUにfullpathというchar配列を設けてファイル名をコピーするようにした.KAKEIZUデータベースは古い3つ組ファイル形式とMFCのアーカイバを使ったZELファイルを扱っているため,かなりややこしい作りになっている.この辺りも少し整理しておきたい.一度バックアップを取ってから始めよう.

ReadFamilyBaseを廃止して,KAKEIZU:readFamilyBaseを直接呼び出すように作り変えてみよう.⇒ReadFamilyBaseの廃止はできたが,Ancestory.zelを開いてエラーが出てしまった.そればかりでなく,バランスも崩れている.エラーはTREEVIEW::DeselectNodeで (!card->selectflag)というエラーだ.今朝のバックアップでもTREEVIEW:DeselectNodeのエラーは出ないもののバランスは崩れている.後戻りしない修正を繰り返しているので,不良の出ない版まで戻るのは難しい… TREEVIEW::DeselectNodeのエラーも出ている.ファイルを開き直すと発生する.⇒ここはもはや目を瞑って水に飛び込むしかない.

▲ファイルを開き直すと(!card->selectflag)というエラーが起きる.これはselectcardlistとカードのselectflagが同期していないことを示すものだ.⇒ファイルを開いたときにselectcardlistをクリアしていないのではないだろうか?⇒clearという関数は持っている.ファイルを閉じたときにclearしていないことは確かだ.これはフェーズの遷移にも関わる問題なので,やはり一度修正をフィックスしてしまうことにする.フィックス対象のOPTIONSは4つある.

  1. baselistをTREEVIEWに移動@20201209 13箇所
  2. TITLELINKをFAMILYTREEに移動@20201209 26箇所
  3. フェーズ遷移はOpenFamilyBaseで行う@20201209 1箇所
  4. COUPLING:ReadFamilyBase廃止@20201209 3箇所

コメントを残す

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

CAPTCHA