#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のトップページをご覧ください。