昔の技術メモ

since 97 12/1

お悩み解決FAQテキスト (主にPS)

Q01 PSにて、コンパイルができません。

  • ファイル名は8文字以上になってはいませんか?
  • コンパイルしたいファイルを、更新し忘れてはいませんか?
  • MAKEFILEに、ソ−スファイル名を追加し忘れてはいませんか?

Q02 PSの関数解説HTMLにて、RotMatrixの引数が、逆になっているようですけど・・。

  • そのとおりです、逆にして下さい(今のバ−ジョンでは直ってるかも)。他にもあるみたいなので、騙されないよう、注意して下さい。

Q03 ヘッダファイルで、変数を増やしただけで、プログラムが動かなくなってしまいました。

  • そのファイルは、複数のファイルにインクル−ドされていませんか?対象となるファイルを全てコンパイルし直さないと、結果がおかしくなりますので気を付けてください。

Q04 何故か、構造体の変数に代入できないんですが。

  • .(ピリオド)が,(カンマ)になっていませんか?解像度が高いと、見分けにくいので注意して下さい。

Q05 さっきまで、動いたソ−スが、急に動かなくなってしまったんですが。

  • newで確保したオブジェクトの開放(delete)を忘れてはいませんか?
  • if文で、 == を = と、書き間違えてはいませんか?
  • 変数の初期化を、忘れているところは、ありませんか?
  • あるべきデ−タ(ファイル等)がなかったりしませんか?エラ−チェックはきちんと行いましょう。
  • デバックの為に、仮に書いておいたソ−スを、消し忘れてはいませんか?
  • ヘッダファイルの関数宣言で、;(セミコロン) を忘れてはいませんか?
  • 0除算していませんか?
  • 構造体の中身を変更した際、関連のあるファイルをきちんとコンパイルし直していますか?
  • オーバーレイを使用しているのであれば、複数のオブジェクトファイル内に同じ名前のグローバル変数が存在していませんか?static を付けてローカル仕様にする等の処理を施してください。
  • オーバーレイしている場合、別オーバレイの命令が奇跡的に動いていたりしませんか?
  • 配列のポインタ指定を誤ってはいませんか?
例)
    char abc[3];
    …
    …
    bzero(abc[0],3);	//正:bzero(&abc[0],3);
  • 別Object内の関数が混じっていませんか?お互いに共通のlibやヘッダを使用している場合どちらもきちんとコンパイルし直すようにしてください。他人のライブラリやプログラムを使用している場合も同様です。
  • OTをはみ出して登録してませんか?はみ出すとメモリを破壊してしまいます。

Q06 配列で不可解なバグが発生するのですが。

  • 値が、オ−バ−(アンダ−)フロ−していませんか?
  • 確保した領域以上に、値をいれてはいませんか?

Q07 PSで、異常に処理が遅くなるのですが。

  • 1つのプリミティブを、OTに2度以上登録していませんか?

Q08 変数にアクセスしただけで、トんじゃうんですが・・・。

  • Q05,Q10参照

Q09 char型の変数の数値が、おかしいような気がするのですが

  • 符号付きか無しかを、間違えてはいませんか?PSでは,charは 符号無し と判断されています。

Q10 PSで、なぜか、デ−タの中身を参照できません。アドレスエラ−が出てしまいます

  • PSでは、厳密なアドレス情報を求めてきます。DWORDなら4byte単位、WORDなら2byte単位、BYTEなら1byte単位で、アクセスしなければいけません。たとえばDWORD型のポインタで3byte目にアクセスしようとするとトびます。その場合はBYTE型のポインタでアクセスしてください。

Q11 存在しているはずの関数が not defined と言われてしまいます。

  • 宣言し忘れてはいませんか?
  • not defined と言われる関数の含まれたファイルを、更新し忘れてはいませんか?
  • MAKEFILE、もしくは LISTファイルに、その関数が含まれたソ−スファイル名を追加し忘れてはいませんか?

Q12 暗黙の宣言がなんたら・・と言われます。動作に支障はありません。

  • きちんと宣言を行っていますか?

Q13 ファイルを読み込もうとしたら、飛んじゃいました。

  • 読み込み先の容量は足りていますか?
  • Q05,Q10参照

Q14 CD-DAに雑音が入ってしまいます。

  • シ−クの際に音量を0にしていますか?
  • デ−タ位置は正しいですか?
  • デ−タ自体にノイズが入っていたりはしませんか?デ−タ形式によっては、最初と最後にちょっと雑音が入ります。

Q15 デ−タの内容が思ったとおりの値になってくれません。

  • unsigned と signed を間違っていませんか?
  • デ−タの更新し忘れはありませんか?(デ−タファイル、ヘッダファイル等)

Q16 リンク時に、宣言もしてあり存在しているはずの関数が、変な文字を含んだ関数名で、エラ−にされてしまいます。

  • 宣言されてる関数名と、実際の関数名が本当に同じになっていますか?大文字、小文字等にも、注意して下さい。
  • その関数はCで組まれたものではありませんか?C++でCの関数を使用する際には 宣言時に extern "C"{} で括ってください。
  • Q11参照
  • ライブラリが古くありませんか?ライブラリを消去して改めて生成してみてください。

Q17 なんか計算結果がおかしいです。

  • 計算式に #defineマクロ を使用してはいませんか?
(例)
    #define KEISAN 2+1
    int Ans = 5*KEISAN+1;

結果は 16 ではなく、12 になります。これを防ぐために、

#define KEISAN (2+1)

と宣言するといいでしょう。

  • & や | を使っていませんか?式はきちんと括弧で括りましょう。
(例)
    × if( test & 0x3 == 0 )
    ○ if( (test & 0x3) == 0 )
  • 本当に結果が間違っていますか?実は自分が間違っている場合もあります。

Q18 プリミィティブが、消えたり点滅したりと、おかしな動きをするのですが。

  • 確保したOTをはみ出して、登録したりしていませんか?

プリミィティブをきちんと初期化していますか?

Q19 CdSearchFile関数で、ファイルを見つけることができません。CdReadFileではうまくいきます。

  • CDに書き込む時、ファイル名を全て大文字にしていますか?

  PSはどうやら、大文字小文字の同一視がきっちりなされていないようなので、気を付けてください。

  • ファイル名の一番後ろに ;1 が付いていますか?ISO-9660規格のファイルの識別コ−ドです。

 これを付けないと読めないファイルが出てきます。気を付けてください。
 (例)

 CdlFILE fp;
 if( CdSearchFile(&fp,"\\TEXT.TXT;1") != 0 )
  return FALSE

Q20 どうみてもバグのないところで、コンパイルエラーが出てしまいます。

  • //コメントが原因の時があります。

  最後尾が\(ルート)コードになってしまうと、
  その下の行までコメント扱いになってしまうためです。
  最後に半角スペース等を入れる癖をつけるとよいでしょう。

  • asmconvをかける場合、ラベル以外のコードは頭にタブが1つ以上入っているか

  確認してください。ラベルと混同されてしまう場合があります。

  • 見間違いです。もっとよく調べましょう。

Q21 一つしかないはずの変数が2重定義といわれてしまいます。

  • その変数はヘッダファイルに書き込まれていて、そのヘッダファイルが

  複数のファイルにインクルードしていたりはしませんか?

  • 他のオブジェクトファイルやライブラリ内で宣言されてはいませんか?

Q22 いくらソースを修正しても、結果が変わりません。

  • きちんと対象ファイルをセーブしていますか?
  • 本当にそのファイルがコンパイルされていますか?
  • リンクファイル群に昔のオブジェクトファイルやライブラリが混じっていませんか?

Q23 ヒープ領域はたっぷりあるのに、mallocで1byteも領域が取れなくなってしまいました。

  • メモリ空間を破壊しています。

 どこかで確保した領域以上にアクセスしていたりしませんか?

 おバカ例)
  ×
   addr = (char*)malloc(sizeof(filename)+1);
   strcpy(addr,filename);
  ○
   addr = (char*)malloc(strlen(filename)+1);
   strcpy(addr,filename);
  • 作りかけの関数があったりしませんか?
  • GetMemSize()は怪しい?!

Q24 呼ばれていないはずの関数が呼ばれてしまいます。

  • そこはなにかの関数の終わりで、その関数内にはクラスが含まれていませんか?

 そのデストラクタが呼ばれているのではないでしょうか。

Q25 コンストラクタが呼ばれないことがあります。

  • そのクラスはグローバルで宣言されていませんか?

  よくはわかりませんが、グローバルで宣言されたクラスはコンストラクタが呼ばれないようです。何ででしょうね?

  • ソフトウェアリセットされた時はコンストラクタは呼ばれません。

  変数の初期化もしてくれないので、きちんと初期化する必要があります。

Q26 あるはずのファイルにアクセスできません。

  • \(ルート)表記の時、Cのソース上では "\\"としていますか?

  もしくはCソースではないところで"\\"と表記してしまってはいませんか?

  • 本当にありますか?スペル等しっかり確認してください。 

Q27 デバッカでじわりじわり実行すると動くのに、普通に実行すると失敗します。

  • 基本的にメモリ破壊バグと考えると良いでしょう。Q05,Q10も参照してください。
  • オーバーレイしている場合、リンク時に吐き出される最新のバイナリをきちんと読み込んでいますか?
  • オーバーレイしているのなら、解いてデバックしてみると良いでしょう。

Q28 画像を読み込むと頻繁にバけます。

  • やっぱり別のところでメモリを壊してました。(安全フレーム解放命令)

  昔作った関数に注意してみて下さい。
  現在と仕様が変わっていると思わぬバグの原因になったりします。

  • Q05参照

Q29 デバッカでブレークポイントを設定しようとすると変なメッセージがでてしまって設定できません。

  • 最適化を解いて -g オプションを付けてコンパイルしていますか?
  • コンパイル時にソースファイルをフルパスで指定していますか?

Q30 どう考えてもしっかり宣言されている#define定義がコンパイルを通らないのですが

  • 2個以上同じ定義が存在していませんか?
  • コメントがその定義の付近に存在していませんか?

  そのコメントを取るか、最後尾に半角文字を一ついれてコンパイルしてみてください。
  コメントの最後尾が¥コードになっている可能性があります。

番外

  • CD系のデバックにデバッカはあんまりつかえない。
  • メモリカ−ド パッド も同様
  • pollhost()がないと、デバッカがまともにうごかないよ

  ※デバッカ専用なので、本番で使用しないように。

  • デバッカでウインドウが固定化されちゃった!!

  Dbugpsx.c0*を消しましょう

950の教え

  • ドライバ更新しておかしくなったらパケットドライバが悪いんだよ
  • パラメータの値がおかしいなと思ったら、もう一度パラメータデータをコンパイルするんだよ
  • MPDマップでなんか微妙におかしいなぁ

  >オブジェクト表示してないんじゃない?
  >OT限界超えてない?

  • 選択肢でカーソルが表示されません!

  >wait_tselect等で指定された選択肢が存在していなくて、処理が中途半端なのでは?
  >画像の裏に隠れているのでは?同じプライオリティの絵に注意!!

  • なにやら950GDC等でコンバートすると特定のファイルだけ動作がおかしくなるだわさ。

  >受け取り側でlong*を使っているのに 4byte単位ではない数値を渡したりしていないかい?”

  • ショップでどんどん文字がおかしなことになっていく!!

  >文章の中に半角文字が混じっているよ
  >インデントをシメていない

  • equ定義に気をつけろ!

  不可思議な変数宣言バグがあったらequ.txtのequ定義が被っていないか確かめてね

  • ファイルは少な目に!!

  >読み込むファイル数はできるだけ少なくしないとシーク時間がもったいない!!

  • メモリの分断化に気をつけろ!!
  • 新たにメモリ領域を使う命令は、全ての開放が終わってから行え!

  >メモリの分断化を防げるぞ!

  • CDでなぜか動かない!!

  >書き込んでいるファイルが違う。
  >書き込んでいるファイルが足りない。
  >キャプチャプログラムが起動している。
  >プログラムのファイル名を直すの忘れて、古いまま焼いた。
  >最初の1クラスタ内に起動に必要なファイルが無い。
  >2Mbyte以上メモリ使っている。

  • あるはずのラベルに飛べない!!

  >直前の文章やラベル指定の "(ダブルクォーテーション) の閉じ忘れはありませんか?

  • アクセス出来ないゴミファイルが出来ちゃったよう

  >scandiskをかけて、ディスクチェックを行ってみよう。
  >dos窓からdosファイル名で消去してみよう。

  • マップファイルの見方

  .bss グローバル変数領域
  
  __bss_org以降が
  グローバル変数領域を指し示す。
  メモリバグの原因を調べるのには有効

  • メニューで辞典呼ぶとバグるバグ原因

  メニューからの復帰のため
  絵オブジェクト内のテクスチャだけを開放して処理していたが、
  他の処理で絵を読み込み、処理後の開放の際、
  テクスチャ検索命令にヒットしてしまって
  二重開放をしていまったのが原因。

  • おバカバグ例

  配列編
   中身をコピーしようとした

  char a[2][2];
  char b[2][2];
  a[0] = b[0]		//バグ!