1,エラー | 0による減算 配列の不正アクセス OSが不安定 ウィルス |
2,環境 | フォントサイズ 表示色数 解像度 98とDOS/V |
起きやすいトラブルの頻度を★で5段階評価しています。
プログラムにバグがあると次のようなダイアログが表示されます。
何度見てもいやなダイアログです。
なぜならば、これはプログラムにミスがあったことを意味している上に
どのようなミスなのか具体的に示していないからです。
プログラムの文法にエラーがある場合は、コンパイルの段階でわかりますし
どこでエラーが起きているのかもわかります。
しかし、コンパイルの段階ではエラーを発見できない厄介なものもあります。
以下によくおきるミスをあげてみました。
●0による減算 ★★★★
関数内で発生するバグで多いのが「0による減算」です。
ご存知の通り5/0は計算不能です。
電卓でこれを行うと「エラー」と表示されるだけですが
アプリケーションでこれを行ってしまうと例の「不正な処理」ダイアログが
表示されてしまいます。
とくに5/0のように明確に記述している場合はすぐに気づくのですが
a/(b-c)のように変数を使っている場合は気づきません。
そこで次のようにします。
変更前 x=a/(b-c); 変更後 if (b!=c){x=a/(b-c);}else{MessageBox("XXXで0による減算を行おうとしました。");}
こうすれば0での減算をしないし、どこで0での減算をしようとしたかがわかります。
●配列の不正アクセス ★★★★★
たとえば、
int a[5];
と配列aを宣言した場合、a[0]〜a[4]にしかアクセスできません、というよりか
アクセスしてはいけません。この場合、a[5]の値を読み書きできるのですが
書き込んだ場合は、「メモリーリーク」が起きてしまい、「不正な処理」ダイアログが
表示されてしまいます。(もっとも、読み込んでも意味はありません。)
C++で厄介なのは、配列の範囲外にアクセスした場合、必ずエラーになるのではなく
たまにエラーになる点です。
このため、配列のデータを読み込み/書き込みを行う場合は
常にアクセスできるのか注意を払う必要があります。
なお、Javaでは、指定された範囲外はアクセスできないので安全です。
●OSが不安定 ★★
たまに、OS自体が不安定になっているためにエラーが起きることがあります。
長時間OSを動かしつづけているとちょっとしたバグによるゴミが
たまってしまってシステムを不安定にしています。
この場合は、Windowsを再起動しましょう。
●ウィルス ★★
パソコンにウィルスが侵入しているために正常なプログラムが
異常を起こすことがあります。この場合はウィルスcheckをしましょう。
また、ソフトを配布するときにも、そのソフトがウィルスに感染してないか
checkをするといいでしょう。
●フォントサイズ
★★★★「小さいフォント」と「大きいフォント」では、文字のサイズが違ってきます。
(測定したら、小さいフォントでは18ドット、大きいフォントでは22ドット)
さらに重要なことに、ダイアログの大きさ自体も変わってしまいます。
したがって、ダイアログ上で座標に依存するような処理はすべて影響してしまいます。
なお、ダイアログに配置されたコントロールはダイアログにあわせて拡大・縮小されます。
では、どのぐらい違うか見てみましょう。
ところで、ダイアログ上にかかれている目盛りは、ちゃんと収縮しています。
これは、座標変換を行ったためです。座標変換のプログラムは次の通りです。
void CAboutDlg::OnPaint() { CPaintDC dc(this); CRect r; CString buf; int i; GetClientRect(r); dc.SetMapMode(MM_ANISOTROPIC); dc.SetWindowExt(1000,750); dc.SetViewportExt(r.right,r.bottom); buf.Format("right=%d,bottom=%d",r.right,r.bottom); dc.TextOut(0,0,buf); for (i=0; i<1000; i+=100){ dc.MoveTo(i,0);dc.LineTo(i,750); dc.MoveTo(0,i);dc.LineTo(1000,i); } }
●表示色数 ★★★
HighColorのもとで作成されたアプリケーションの色が256色環境の
パソコンでみるとかなり違った色になってしまうことがあります。
色のバランスが悪くなる程度ならいいのですが、淡い色は
消えてしまうことがあるので注意が必要です。
●解像度 ★★
現在主流の解像度は1024×768です。
しかし、ノートパソコンや古いパソコンでは800×600で
表示することもかなりあります。
また、TrueColorを使いたい方は640×480の解像度を使っていることもかなりあります。
そのため、それぞれの解像度で試してみて、プログラムが適切に
動作するようにしてください。それが不可能ならば「解像度800×600以上必須」
のようにReadMeに記述する必要があります。
(たいていは低解像度で画面に入りきらないという問題が起きます。
800×600程度までは表示できるようにしてください。)
●98とDOS/V ★★
PC98シリーズでは、ドライブ名の割り振り方が違っています。
DOS/Vでは,フロッピーがAドライブ、ハードディスクがCドライブから
始まり、CD−ROMがQドライブです。
しかし、98シリーズではハードディスクがA、フロッピーがCドライブ
になっています。
C++のPageに戻る