関数分離?@シューティング

こんばんは。
前回レビューのときに、コードを工夫しないと・・・とのことでしたので、考えてみることにしました。

以下は大体の工程?です
・コードを全面的に見直し。→ 描画部・ファイル取得部を再編成
・ロックオン機能
・ホーミング機能についての調査


シューティングのサイトを参考にして描画回りやファイル周りの関数を分けていこうかなと思います。


全体的に、役割があいまいだったり被っていたり、しているので、同じような処理をしているところは関数化していきたいと思います。
最初はシナリオファイル読み込み関数と敵データファイル読み込み関数。
次に敵や味方の描画を1関数に集めていたところを関数化。


シナリオファイルの読み込み関数で1行1行バッファに格納してコマンド化していたのですが、1行分のサイズを測る(?)関数を書いてみたところ、バッファが必要でなくなりました・・サイズがわかれば、読み始めのポインタ+サイズ→リミットにして、読み進めていきながらコマンド化できます。


関数を移動や変更するとき、プロトタイプ宣言と一緒に移動・変更しなければならないので、気軽に関数の仕様を変えることができません。何か良い方法は・・・


シナリオファイルや敵動作定義ファイルの最適化(改行やスペースを省く部分)で一旦文字列をmallocした領域にコピー後、最適化が成功したらコピー元にコピーする処理を行っています。処理後freeすると以下のようなエラーが・・・

HEAP CORRUPTION DETECTED: after Normal block (#273) at 0x004D0068.
CRT detected that the application wrote to memory after end of heap buffer.

調べてみるとメモリ破壊されている!というエラーだそうなのですが、よくわかりません。
ロジック的には

    char *src_str_tmp = (char*)malloc(sizeof(char) * length);//コピー領域確保
    int result = FALSE;
    memcpy(src_str_tmp,src_str,sizeof(char) * length);
    

  〜 src_str_tmp 最適化処理〜

    //成功なら適用
    if(result == TRUE){
        memcpy(src_str,src_str_tmp,sizeof(char) * length);
    }
    free(src_str_tmp);//領域開放

です。
おおまかに言うとコピー領域確保→コピー→最適化処理→コピー→領域開放という手順で、そこが重要なところとは思うのですが・・・
メモリ破壊されている状態が明確に浮かんでこないのと、メモリ破壊と検知される条件がわからないので、試行錯誤しています。



先のメモリ破壊エラーですが、エラーが出なくなりました。原因は不明です・・・
先の状態からの変更点は、最適化処理関数の仕様を変更して、TRUE/FALSEの返り値→有効な文字列数を返り値 へ変えた・・・というだけ。内部的にも元からポインタをコピーして処理している仕様なので、直接的に関わるようなところが見当たりませんでした・・・


う〜ん。いみがわからあああああんん
でも、調べていくうちにこんなサイトがありました。
http://wikiwiki.jp/redstrange/?Visual%20C%2B%2B%20%A4%C7%A4%CE%A5%C7%A5%D0%A5%C3%A5%B0

あとは、関数仕様変更のため、デバッグ中・・・
やっぱり、文字列処理とかまだ苦手な感じですが、徐々にわかってきたかな。
やり始めて10時間ぐらい経ってるので、とりあえず寝よう