『ひとりにしてくれ』を完成させる
…が, 妙な問題が発生する
何故かcallocがBus Errorを起こすのである
state型配列(ポインタ)型tmp->states = calloc(データファイルにより決定, ここでは8固定a->size * a->size, sizeof(enumのtypedef名state)); /* equals to calloc(8 * 8, 4), malloc(256) */
色々試してみたが, どう見てもここが問題なのである
試しにmalloc(2560)やcalloc(a->size * a->size + 1, sizeof(state))とか多少余計にメモリを確保するようにすると正常に動作するのだ
しかしVCに持っていくとやはり同じように異常終了する
今度はエラーとなるcallocよりも前のfreeに引っかかっている
しかし, freeで開放しようとしているのは紛れもなく直前でcallocした領域である
さて, どうしたものか…と思ってデバグ開始, エラーメッセージによると要するに今開放しているブロック, ブレークポイントを設けてメモリ確保の瞬間のアドレスは控えているからアドレス違いではない確保したブロックの後ろに『これだからあまりよく分かっていない分野での英語エラーは嫌になる(どうせ日本語でも理解度は変わらないだろうが…)Damage』とやらがあるご様子, いろいろ探して…見つかりました
ここでは配列の範囲(レンジ)溢れエラーのこと, 一般には『値域エラー』を指す(⇔ドメインエラー)レンジエラー排斥コードのこの所為で配列の直後の4バイト(1要素分)を書き換えてしまっていた模様, 道理で大きく確保すると大丈夫なわけだ…一部の不等号に『=』を付け忘れていました
これはメモリ的にはまずいのだが, アルゴリズム的にはちっともまずくないというのはちょっと虚しい…まずいです, まずすぎます…ということで修正, 何とか直りました
これで完全版が完成, 実は初めての今までは関数の再帰に置き換えたものしか作っていませんでした手製のスタックを使ったプログラムへの挑戦でした
とりあえず工学部電気系の課題なのでソースは公開できませんがチェック用に実行ファイルはもう削除しちゃいました, ごめんなさい上げておきます