#pragma twice

KAB-studio > プログラミング > #pragma twice > 101 Version 6.01 バグってなに?

#pragma twice 101 Version 6.01 バグってなに?

前のページへ 表紙・目次へ 次のページへ

 Version 6.01
バグってなに?

 KAB-studio.h 3周年目に突入!  #pragma twice も Ver 6 に!
……なんかシャレになんないくらい、長い時間掛かってるような……
ま、最後まで付き合ったげるから気にしない気にしない! で、今回から
は何教えてくれんの?
 Ver 6 では〈バグ〉と〈デバッグ〉ってものについて
バグってゲームでよく聞くよね、よーするにプログラムのミスってヤツで
しょ
そうなんだけど、この辺をもうちょっとしっかりはっきりしておきましょ
う。えーっと、まずビルドについて
ビルド? いつもフツーにしてるじゃん
実はその〈フツーにしてる〉のは、いろんなことを自動化してるから〈フ
ツーにできてる〉んです
ってことは、ホントはボタンひとつでできることじゃないってこと?
そういうこと。じゃ、まずは今回用のプロジェクトを作っちゃおうか。い
つもどおり MFC 使うのでダイアログので作って
ほい。とりあえず Ver 5.01 ( No.066 ) の時と同じよーに作るね。プロ
ジェクト名は…… Debug にしよっと
作ったらとりあえずビルド
ほい

--------------------構成: Debug - Win32 Debug--------------------
リソースをコンパイル中...
コンパイル中...
StdAfx.cpp
コンパイル中...
Debug.cpp
DebugDlg.cpp
コードを生成中...
リンク中...

Debug.exe - エラー 0、警告 0

そういえば、ビルドってしてる間にも色々としてるんだね
基本的には、ビルドは2段階の処理を含んでます。まず〈コンパイル〉
のーみそこねこね
そう、その会社の元ネタがこれね
う”、ボケになんなかった……
火美ちゃんなんかが書いたプログラムを、コンピューターが理解できる形
式に変換することが〈コンパイルする〉ってことです
そういえば、前に Exe を16進形式で見たことあったよね。よーするに
あーゆー形にすることを〈コンパイルする〉っていうんだ
そういうこと
あれでも、そういうふうにすることがビルドってことだと思ってたんだけ

実は、コンパイルは、各ソースファイルごとにしかされないんです。って
ことは、最後にそれを全部くっつけて、ひとつの Exe にする必要があるん
です。それを〈リンクする〉って言います
トライフォースを集めて〜って
それもそうなんだよね……
ええっ?
トライフォースを〈継なぎ合わせてひとつにする〉からリンクって名前に
したんだって
実はゲーム業界って、プログラミング用語ばっか?
特に昔はね……。で、ここではとりあえず〈ビルド=コンパイル+リンク〉
ってことだけ憶えておいて
それが後々重要?
っていうか今重要。前に教えた〈テストアプリの作り方〉のとおり、ダイ
アログにボタン追加してメンバ関数作って
 Ver 4.01 ( No.051 )のときのね。あ、1年前だ

void CDebugDlg::OnButton1() 
{

}

とりあえずこれをこう書き換えて

v0id CDebugDlg::OnButton1() 
{

}

どこ違う?
 void を v0id に。こうやって、わざとエラーを出してみて
あ、そういうことか。ビルドっと

--------------------構成: Debug - Win32 Debug--------------------
リソースをコンパイル中...
コンパイル中...
DebugDlg.cpp
DebugDlg.cpp(173) : error C2143: 構文エラー : ';' が 'tag::id' 
    の前に必要です。
DebugDlg.cpp(173) : error C2501: 'v0id' : 識別名を宣言するのに、
    型が指定されていません。
DebugDlg.cpp(173) : fatal error C1004: 予期せぬ EOF が検出されました。
コードを生成中...
コンパイル中...
Debug.cpp
コードを生成中...
cl.exe の実行エラー

Debug.exe - エラー 3、警告 0

注:横に入りきらないから勝手に改行とかしてます!
で、こういうエラーを〈コンパイル中に出たエラー〉だから〈コンパイル
エラー〉って言います
コンパイルエラー、ってそのまんまね
じゃ次。今の元に戻して

void CDebugDlg::OnButton1() 
{

}

これ全部削除してからビルドして
ほい

--------------------構成: Debug - Win32 Debug--------------------
コンパイル中...
DebugDlg.cpp
リンク中...
DebugDlg.obj : error LNK2001: 外部シンボル ""
    protected: void __thiscall CDebugDlg::OnButton1(void)" 
    (?OnButton1@CDebugDlg@@IAEXXZ)" は未解決です
Debug/Debug.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー

Debug.exe - エラー 2、警告 0

を、今回はリンク中だからリンクエラー?
その通り。こういうリンク中に発生したエラーを〈リンクエラー〉ってい
います
なるほど。削除、元に戻しとくね
うん。さて! ここが重要。〈コンパイルエラー〉と〈リンクエラー〉、
このふたつは〈バグ〉と言いません!!
え? なんで? プログラムのミスじゃん
このふたつのエラーだと、 Exe ができないでしょ。そういうエラーはバ
グって言わないんです
じゃ、何をバグって言うの?
たとえばこういうの

void CDebugDlg::OnButton1() 
{
    int *pi = NULL;
    *pi = 100;
}

えーっと、 int のポインタ作ってそれを NULL で初期化して、そのポイ
ンタが指し示すとこに 100 を……って、 NULL なんだからダメじゃんこ
れ。あ、これがバグの例なんだもんね
そう。これをビルドすると
エラーになんない
実行すると?
ダイアログ出た

ハンドルされていない例外は Debug.exe にあります 
    0xC0000005: Access Violation

なんか怒られた……これどうすればいいんだっけ
 OK 押してダイアログ閉じてから、【デバッグの中止】ボタン押して
【デバッグの実行】にバツついてるのね
終了させたら、今度は Debug.exe を直接実行してみて
直接?
プロジェクトのフォルダ開いて、その Debug フォルダに Debug.exe があ
るでしょ、それをダブルクリック
ダブルクリックしてボタン押して……うお、なんか嫌なダイアログが!!

このプログラムは不正な処理を行ったので強制終了されます。
終了しない場合は、プログラムの製造元に連絡してください。

と、こういうふうに胃の痛くなるダイアログが出ます。ちなみに【デバッ
グ】ボタンを押すと
ん?  VC が立ち上がって……さっきの〈ハンドルされてない〜〉が出た
こういうふうに、 VC を経由するとこういうチェックができます
で、こういう実行中に出るのが、ホントのバグっていうのね
いや、正確には〈ランタイムエラー〉って言います
ランタイムって
あのランタイム関数とかとは別物。このランタイムはその名の通り
実行中のエラー、ってことね
このランタイムエラーはバグの一種。つまり他にもバグの種類があるって
こと
どんなの?
たとえば……

void CDebugDlg::OnButton1() 
{
    while( 1 )
    {
    }
}

あ、無限ループだ
これはさっきみたくダイアログは出ないけど、動かなくなっちゃうってい
う点でバグ
他には?
その他、テキスト表示の中の誤字脱字、マニュアル通りに動かない、とか
わかった! つまり、一応実行はできるんだけど思い通りに動いてくんな
い、っていうのをバグって言うんだ
そういうこと!
じゃ、実行することさえできないコンパイルエラーとリンクエラーはバグ
じゃない、ってことになるわけね
ちなみに bug っていうのは〈虫〉って意味
虫?
コンパイルエラーとリンクエラーは簡単に見つけられるけど、ランタイム
エラーは場所が特定しにくいわけ。それを比喩して、プログラムのどっかに
蟲が蠢いている、と……
うわ、なんか嫌……
ってのはちょっとウソ入ってるんだけどね
なんですと!?

/*
    Preview Next Story!
*/
水希ちゃんのウソツキ!
ま、今はこの意味の方が良く知られてるけどね
じゃ、ホントはなんで bug っていうの?
本当に、虫が回線に触れてショートして誤作動した、って話
……それウソでしょ
ホントだって
どうかなー
というわけで次回
< Version 6.02 コンパイルエラーをなくす! >
につづく!
ちなみにその虫がスミソニアン博物館に飾られてます
それはウソ!! 絶対!
 http://americanhistory.si.edu/csr/comphist/objects/bug.htm 
……はぅん……
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。