2012年7月13日金曜日

メモリの量と情報量

メモリの最小単位はビット(bit)です。
1ビットは0か1かの様に2通りの状態を表現できます。
2ビットあれば2つのビットを組み合わせて
00, 01, 10, 11の4種類の状態が表現できます。
つまり1ビット増えると情報量が2倍になります。
8ビット(1バイト)は256種類です。
32ビット(4バイト)は4294967296(約43億)の状態を表現できます。
表計算ソフトを使えばすぐにビットが持てる情報量を確認できます。
これはOpenOfficeを使った例です。



 
 良く整数型に32ビットが使われますが、普通のint型は正負の情報に1ビット使うので絶対値としてはその2分の1の値となり、さらに0から数えるのでそれも状態数の一つとしてカウントすると扱える最大数は-1になったりもします。
処理系によって型の容量は変わりますが扱える数の最大値と最小値は

#include < limits.h>
とヘッダを追加した上でINT_MAX等のマクロで得ることが出来ます。

intの最小値と最大値
printf( " %d ", INT_MIN );//-2147483648
printf( " %d ", INT_MAX );//2147483647


ビットを実感してみよう

 int a =32;
 a = a >> 1;  //16になる。

>>は、右シフトという演算子です。
これにより、変数aのビット列を右に1つずらしています。
それでどうして値が半分になるかと言うと
2進数で10進数の32を表すと
----------------------
32  16   8   4   2   1 ←ビットを1にした時に増える数
1   0    0    0   0   0  ←この行が実際のビット列(2進数)
----------------------
となるので
ビット列が右にずれると・・
----------------------
32  16   8   4   2   1 
  0   1    0   0   0  0  
----------------------
10進数で言うと16の値になる分けです。

2012年7月10日火曜日

デバッグ


デバッグモードとリリースモード

ビルドにはデバッグモードによるビルドとリリースモードによるビルドの2種類があります。画面上のコンボボックスから、あるいはソリューションのプロパティーなどから切り替えが出来ます。主な違いは次の通りです。
デバッグモード (Debug)
VC++、あるいはAPIやライブラリが備えるデバッグ用の機能をフルに発揮できます。例えば実行時に予期せぬ動作をチェックしてエラー情報を教えてくれます。基本的に開発中はこれを使いましょう。

リリースモード(Release)
デバッグの能力は低くなりますが高速に動作するコードを生成します。アプリケーション完成時など、だいたいバグもなく運行できると確認できてから使えば良いです。ただしコードによってデバッグモードとの速度差は結構生じるので、速度を気にするプログラムを作る時などは必要応じてこちらのモードもチェックします。

デバッガのブレークポイント機能

デバックの時にとても役立つのがブレークポイントの設置です。VC++ではエディタ画面の左端の部分をクリックするかF9キーを押すことでブレークポイントのオン/オフが出来ます。

ブレークポイントは赤い印で示されます。ブレークポイントを設定するとプログラムをデバッグモードで実行している時にその場所で一旦プログラムが停止します。
そしてその時、自分が使っている変数にどのような値が入っているかを確認する事ができます。

確認が終わったら再度プログラムを走らせる場合はF5,もうここでプログラムを終了させたい場合はShift+F5を押します。

その他

デバッグ全般の話題はこのサイトVC++の使い方) とか
MSDNのデバッグルーチン (玄人向け)とか。

ソリューションにプロジェクトを束ねる

例えばサンプルブラウザから展開したプロジェクト達をいちいちバラバラに立ち上げるのは面倒なので一つのソリューションにまとめた方が良いかも知れません。私はチュートリアル1のソリューションに他のチュートリアルのプロジェクトを追加しました。(ただしチュートリアル2と3は同じものなのでどちらか片方を追加すれば良いかも知れません。)やり方は次のような感じです。(ちなみに私が試してみて結果として大丈夫だったというだけで、正式なやり方がどうだとか、今後問題がないかとかは知れませぬが・・・)

1 プロジェクトの追加
ソリューションエクスプローラから「ソリューション」を右クリックして「追加」→「既存のプロジェクト」を選び、追加したいプロジェクトを指定します。


2 ビルドの設定
デフォルトの設定では初めのプロジェクト以外ビルドできないと思うのでソリューションエクスプローラから「ソリューション」を右クリックして「プロパティ」を開きます。


「共通プロパティ」の「スタートアッププロジェクト」の「現在の選択」にチェックを入れます。


これでソリューションエクスプローラから選択したプロジェクトをビルド・実行できるはずです。その際「デバッグ情報が見つからない、または一致しない」という様な警告がでた場合は一端そのプロジェクトをリビルドするかクリーンして下さい。

その他VC++の機能やショートカット等

 VC++には色々と便利な機能があるので
「ツール」メニューから「設定」で→「上級者用の設定」に変えた上で
色々と試してみるのが良いと思います。

特にメニューの「表示」から出せるクラスビューやオブジェクトブラウザーやブックマーク等は便利です。

あと、任意の単語を右クリックした時に出るメニューなんかも地味に便利なんじゃないでしょうか?「定義へ移動(F12)」したり、「すべての参照の検索」が出来たりします。
 すべての参照の検索の後、その結果がリストアップされます。そこをダブルクリックするとその部分にジャンプできます。
また、F8キーを押すと、リストアップされた参照箇所に次々と移動できます。
F8キーは、デバッグ時のエラーメッセージの該当箇所を追う時にも使えて便利です。


その他

・F1キーで開くHelpが、選択中の項目を説明してくれることがありますビルドエラー時、出力ウインドウでF1キーを押せば、該当するエラー内容を解説するページが開きます。他にも、プロパティの設定項目を選択中にF1等、意外とF1が役に立ちます。


・カーソルを合わせた行で、何も選択しないでCtrl+Cを押すと一行が丸々コピー対象になります。

・既に定義されている関数は途中まで名前を入力したらCtrl+スペースキーで残りを補完できる事があります。(インテリセンス機能)

・Ctrl押しながら-で前に編集してい箇所に戻れます。(前に戻るボタンと同じです。)
再び、元の方へ戻るにはCtrlとShiftを押しながら-です(Ctrlと+を押したくなるのだが・・・)。

他にも、VC++限定の機能というわけでもありませんが、
・Ctrl+マウスホイールで文字の拡大・縮小
・Ctrl+F で検索や置換
・Ctrl+Aで全選択
できます。

あと
VC++の便利な機能 (外部へのリンク)というページには、ショートカット系のネタが豊富です。


2012年7月7日土曜日

デバイス、イミディエイトコンテキスト、スワップチェーン


訳者メモ


これら3つのオブジェクトの型はチュートリアルコード中で次の様に宣言されています。
ID3D11Device* g_pd3dDevice = NULL;
ID3D11DeviceContext* g_pImmediateContext = NULL;
IDXGISwapChain* g_pSwapChain = NULL;

イミディエイトコンテキスト( g_pImmediateContext )はデバイスコンテキスト型(ID3D11DeviceContext)のオブジェクトです。型名とインスタンス名で名前が違うのはDirect3D11のデバイスコンテキストにはマルチスレッド用途に初期化する方法(ディファードコンテキスト)とシングルスレッド用途に初期化する方法(イミディエイトコンテキスト)があり、その違いを明確にする意図がある様です(参考(MSDN))。あと古来からあるWindowsプログラミングGDIにもデバイスコンテキストがあるので間際らしいような、あるいは概念的な類似があるのでむしろ分かり易いかも?

Tutorial 00: Win32 Basics

(訳注: Direct3D10 Tutorial 00: Win32 Basics はHelp内リンクなのでここには貼れませんがWindowsプログラミングでは同じみのウインドウ作成とメッセージループのコードを簡潔に解説した内容です。当サイトではWin32APIプログラミングの部分で解説しています。

Direct3D デバイス


(訳者メモ----------
デバイスを直訳すると装置です。漠然とした言葉ですが、Direct3Dで装置と言えば、(3D)CGを描画するための装置を指します。Direct3Dは内部でビデオカード等のグラフィック装置を操ります。我々はビデオカードに直接アクセスするようなコードを作成する必要はなく、Direct3DAPIによって抽象化された仕組みを通して描画機能を得る事になります。ここでいうデバイスとは、この抽象化された装置を差します。

なお、
C++のソースコード上から
ID3D11Device* g_pd3dDevice
の様に具体的なオブジェクトとしてDevice(デバイス)を見る事ができたりします。つまりDirect3Dが一つのクラス(COMインターフェース)としてデバイスを表現している訳ですが、ここではその他の基本的なオブジェクトも含めてデバイスと呼んでいる感じがします。
----------)