こうなったらまた出戻る以外の選択肢はない

とんでもないことになってしまった.大きな過ちを冒していた.こうなったらまた出戻る以外の選択肢はない.リスタートポジションは確保したのでもう一度やり直すことにしよう.大部分の修正はヘッダファイルの書き換えなので,修正がそのまま再利用できるから必要な作業は最小限のものに留まる見込みだ.おそらく今日中にもクリアできるだろう.

この作業は二つのポイントから見て重要だ.条件コンパイルは基本的にプログラム開発の分岐点に相当するから,分岐点がp個あれば,観念的には2^pの異なるバージョンが存在することになる.仮に条件コンパイル文が100個存在するとすれば,

2^100=1,267,650,600,228,229,401,496,703,205,376

もの異種バージョンが存在し得ることになる.修正をフィックスするという作業の目的はこの分岐点を最終的にはゼロ個まで削減し,2^0=1,つまり,単一バージョンまで統合することにある.この状態になって始めてプログラムは「正式版」と呼ばれることになるだろう.

条件コンパイルのもう一つの解釈は,それがプログラム開発の履歴を表現するものとなっているというポイントだ.つまり,「分岐点」というのは一つの新しい「進化」の方向性であり,プログラムの成長を促す「新芽」であると考えられる.修正をフィックスした時点でその分岐に付けられたコメントは「修正履歴」として記録されるべきだ.この「履歴」はプログラムの開発途上で「経験」したさまざまな事象の蓄積であるとも考えられる.この「経験された事象」は具体的には「障害」ないし「障壁」であると考えられるから,それに対処するために実装された「対策」を体系化したものが「免疫系」と呼ばれるシステムであり,「自己の恒真性を維持するための仕組み」であるとも言える.

さて,ぼちぼち始めることにしよう.現状では#defineで定義された値を持たないキーワード(コンパイルオプション)は226箇所ある.昨日確認された186件に比べると大分多いが,これはヘッダファイルが最新でC++ソースファイルが古いバージョンに戻っているため重複が発生していることによる.まず,この重複を解消するところから始めよう.昨日Meryを再インストールして「並び替え」マクロを使うことができるようになったので,この作業は簡単だ.検索結果をMeryで並び替えして重複行をチェックするだけでよい.⇒対処した.

#define\s+\S*\s*(/|$) (C)

で検索すると,まだ200個残っている.14件のダブリが残っているが,これはリネームしているものがあるためと思われる.DLLだけバックアップを取って進めることにしよう.現状では#ifdef が372個,#ifndef が59個,#if defined が429個,#if !defined が44個ある.#if の方はすでに原則としてすでに始末されていると考えられるので,#ifdef, #ifndef の431個を個別にチェックしてゆくことにする.#ifdef, #ifndef を #if の形に書き換えるのは正規表現を使って一括処理できるはずだから,まず,以下のような修正を実施することにする.

  1. #ifdef, #ifndef の条件式(キーワード)が#define によって定義済みのときは何もしない
  2. キーワードが未定義のときは,現状のままフィックスする つまり,グレー表示のアクティブでないブロックを削除し,平文に戻す アクティブでないブロックが存在しないときも同じ
  3. キーワードが未定義でアクティブなブロックが存在しないときは,x行削除のコメントを残してアクティブでないブロックを抹消する
  4. ただし,内容に疑義があるとき,ないしそのオプションの存続が必要と認められるときには,新たなキーワードを定義し,負論理を正論理に改めた上で条件分岐文を温存する
  5. 特定ヘッダファイル(nodule.h, comdebug.h, coupling.h, Bobject.h)以外のファイルにある#define文はLOCAL: に属するものを除いてすべて抹消する
  6. 「衝突検定で計算誤差を許容する」に関わる論理はすべて温存して後日再検証することにする 未定義のものに関しては新たにキーワードを定義し,「衝突検定で計算誤差を許容する」という表記とMAXKEISANGOSAの適用が「同期」するように真偽値を定める 
  7. ただし,「計算誤差を見る」の類は現状(AboutEqualを使う論理)でフィックスする 「計算誤差を無視する@20170509」も確定する 「MAXKEISANGOSAを適用する@20171229」は現状でフィックスした
  8. 「この関数は最高速で実行されるべきだ」の類は「速度最優先オフ」に統合する
  9. キーワードが定義済か否かの検査を「定義をここに表示」メニューで判定してはならない 定義はあってもコメントアウトされている場合があるので,つねに「実検索」の結果を見て判断する必要がある
  10. 何かの理由で温存したい論理がある場合には,if 0/1 のような表記を認める
  11. 「配偶者の性別不問とした@20180201」は未定義だが,新設してPENDINGとする 「メタファイルに出力する@20180312」も未定義だが,PENDINGとした

コンパイルエラーが発生した ⇒最優先オフをオンにしたためだ.checkブロックの内容が古くなっていた.⇒対処した.

非アクティブブロックがグレー表示されなくなってしまった.これでは修正を誤る可能性が高い.⇒ビルドし直したら正常に戻った.⇒ダメだ.また出てきた.今度はビルドして戻らない.一旦VSを落として再起動でようやく正常に戻った.

古いコードでDEBUGPRINTというマクロが見当たらない.⇒空のマクロを作っておく.DEBUGDUMPというキーワードはマクロとオプションの両方に使われている.整変数に使っているところもある.整変数はiDEBUGDUMPとしてみよう.マクロはmDEBUGDUMPとする.

NAMEBOX:: PaintNameFrameは2つの関数から呼び出されている.デバッグ時にはNAMEBOX::Drawから,リリース版ではNAMEBOX::DrawNameからという変則的な呼び出しになっている.おかしいので,つねにNAMEBOX::Drawで実行するように書き換えた.

#ifdef と#ifndef の点検は完了した.あとは整理するだけとなった.その前に#ifdef を#if defined の形式に変換してしまおう.いや,その前に#defineされて使われていない定義というのがあるはずなので,それを先に片付けてしまおう.⇒#defineの個数は200個になった.増減があるので,多分これで正しいのだと思う.バックアップを取っておこう.#ifdef から #if defined への一括変換は昨日やっている.

検索:#ifdef (.+)\b
置換:#if defined($1)

ただし,この方式ではコメントが入っている行ではコンパイルエラーが発生する.コメント付きの場合にも適用できるようにしたい…

検索:#ifdef\s+(\S*)(/|\b)*?   (S)
置換:#if defined($1)       (R)

これでなんとか行けそうだ.#ifdef は140個ある.140個置換した.⇒うまくいった!ビルドも通った.#ifndef も同じ要領でやっておこう.#ifndef は61個ある.⇒問題なく変換できた.さて,この200個の#define文が1個になるまで削減するというのだが,可能だろうか?とりあえず,やり易いところからやってゆくことにしよう.

まず,ローカルに定義されているLOCAL: は整変数に変えてしまってもよいだろう.実際この方LO法は現在すでに使われている.#define DISPALWAYS を int DISPALWAYS に変えるというだけだ.⇒これで定義文は7個減って193になった.残りはすべて特定ヘッダファイルだけということになる.

これはダンプルーチンなどをシステムの装置に組み込むということを意味する.計測装置をシステムに組み込むというのは,たとえば車にスピードメーターを付けるようなものであり,もしロジックが混み合うようなことがあれば,その部分だけ切り出してルーチン化してやればよい.Bobject.hにはDEBUG:という区分でデバッグ用の定義がどっさり入っているが,装置化できるものは装置化してしまうのが一番よいと思う.少なくとも1つのファイル内で完結している定義に関してはそれをやるべきだろう.いままでやってきたことと真逆のことをやることになるが,それも仕方ない.⇒この修正は一旦撤回することにする.

▲comdebug.hの古いプリント文などの定義は廃棄してもよいのではないか?

▲_DEBUG_,XDEBUGなどの動作をチェックする必要がある 古いバージョンは廃棄した方がよい

すべての定義文をデフォルト(=現状)でオンとデフォルトでオフに区分けして管理する その上ですべての定義文をオンにして動作を確認する また,すべての定義文をオフにして動作を確認する ただし,comdebug.hとcoupling.hの管理する分は除く(ということは対象はnodule.hとBobject.h内の定義文に限定される

まず,すべてのスイッチオンを試してみる.コンパイルエラーが出ている.MERGETESTCARDIMAGEでbool NOCARDIMAGEを初期化しているが,参照されていない.⇒#if 0 で仮止めした.COLCOLORSEGMENTやCOLVERTICALSEGMENTで使っているHというパラメータが未定義.⇒対処した.COLVERTICALSEGMENTで使っているvsegmentという変数が未定義.⇒垂直セグメント検定という機構は完全に廃止されている.SIZEOVERAUTOZOOMOUTでLimitSizeOverの引数が足りない.⇒補充した.⇒とりあえず動いた.

▲TESTタグのPRESETPARAMETERを実行するとNAMEBOX:EraseGhostNode→setCriticalでエラーが発生する.チャンネル不足が発生しているものと思われる.チャンネル数自動ならエラーは発生しない.このエラーを仮修正でパスすると,MakePairListClean中にnoduleのデストラクタで非参照カウントの残留が発生する.サンプルはゼルコバの木モジュール構成図 TEST.ZEL.エラーを無視して描画は可能.PAIRLIST→PAIRBOXの参照が残っている.TESTPERFECTでも同じエラーになる.⇒いや,これはプリセット値が入っていたためと思われる.しかし,自動テストの動作にはなっていない…

▲PENDINGをすべてオン,COMDEBUGは無指定,それ以外のすべてのオプションをオフにしてエラーが発生する.スプリットが発生しているが,それ以上に画面が壊れている.

コメントを残す

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

CAPTCHA