C++

x86ビルドでヒープにXMMATRIXを確保するとうまく動作しない。

てか落ちる。x64ビルドだと大丈夫。 Direct3D11+XNA Mathやってて超ハマってた。Getting Started - Windows applications | Microsoft Docs 型の使用方法のガイドラインただし、ヒープからの割り当てはさらに複雑です。この場合、ヒープから割り当てられるク…

フレンド関数テンプレート

C++

#include "stdafx.h" class Hoge { public: // フレンド関数テンプレートの指定。 template <class T> friend void CallHogeEcho(Hoge&, T); private: void Echo(int x) { printf("Hoge: %d\n", x); } void Echo(const char* x) { printf("Hoge: %s\n", x); } }; temp</class>…

ファイバつかってみる。

関数の途中で戻って再開出来るとか、C言語コードだけ見てたらとても奇妙な冒険。 #include "stdafx.h" #include <Windows.h> const int LOOP_COUNT_IN_MAIN = 5; const int LOOP_COUNT_IN_FIBER = 5; PVOID pMainFiber; PVOID pFibers[4]; struct DestroyChecker { ~Des</windows.h>…

クラステンプレートのメンバ関数、静的メンバ変数を外部で定義する。

C++

クラステンプレートのメンバ関数テンプレートを外部で定義する。 - erio_nk://memo でメンバ関数テンプレートの定義方法は記述してあったが、 ただのメンバ関数や静的メンバ変数の定義方法を記述していなかったので。 template <class T> struct Hoge { // 静的メンバ</class>…

Visual C++ 2010 Express で x64 環境を構築する。

Windows 7 Visual C++ 2010 Express x64 ビルド環境構築 - 日々のコーディングについてのページ こちらのサイトの丸写し状態だが…。 Visual C++ 2010 Express はインストールされているものとして、以下の手順を踏む。 Microsoft Windows SDK for Windows 7 …

32回以上左シフトするには、左辺を64bit整数型にする。

int _tmain(int argc, _TCHAR* argv[]) { int rhs32 = 63; __int64 rhs64 = 63; // NG { __int64 flags = 1 << rhs32; printf("%llx\n", flags); } // OK { __int64 flags = static_cast<__int64>(1) << rhs32; printf("%llx\n", flags); } // NG { __int64 flags = 1 </__int64>…

boolのアラインメント

#include <stdio.h> struct BoolAlign { bool _bool0; int _int0; bool _bool1; bool _bool2; int _int1; bool _bool3; bool _bool4; bool _bool5; int _int2; bool _bool6; bool _bool7; short _short0; bool _bool8; short _short1; bool _bool9; int _int3; }; int</stdio.h>…

コンストラクタを含む構造体は初期化子リストで初期化出来ない。

C++

struct DATA { int _hoge; int _fuga; int _piyo; DATA() : _hoge(0) , _fuga(0) , _piyo(0) {} }; int main() { // error C2552 DATA data[3] = { { 1, 1, 1 }, { 2, 2, 2 }, { 3, 3, 3 }, }; return 0; } Download Visual Studio 2005 Retired documentati…

WinMain関数でmain関数のargc,argvを得る

// 空ファイルを作成する。 #include <windows.h> #include <tchar.h> #include <stdio.h> int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd ) { if (__argc <= 1) return 0; // コマンドライン引数の数 TCHAR* file = __targv[1]; /</stdio.h></tchar.h></windows.h>…

インナークラスからアウタークラスのprivateメンバにアクセス出来る。

C++

class Hoge { public: class Fuga; private: static void PrivateFunc() { } }; class Hoge::Fuga { public: class Piyo; private: static void PrivateFunc() { // インナークラスからアウタークラスのprivateメンバにアクセス出来る Hoge::PrivateFunc(); …

constメンバ関数内で呼べるメンバ関数。

C++

class Hoge { public: void Echo() { std::cout << "echo 'Hoge'" << std::endl; } void ConstEcho() const { std::cout << "const echo 'Hoge'" << std::endl; } }; class Moke { Hoge _hoge; public: void Echo() { std::cout << "echo 'Moke'" << std::en…

ローカルファンクタはgccではfor_eachに指定出来ない。

#include <iostream> #include <vector> #include <algorithm> /* // 関数内じゃなければ、gccでもOK(当たり前だけど)。 struct Proc { void operator () (int val) { std::cout << val << std::endl; } }; */ int main() { // ローカルファンクタクラス struct Proc { void operator ()</algorithm></vector></iostream>…

vectorのコピーよりswapのが早そう。

コピー元のデータ(vector)が壊れてもいい場合(コピー元が一時バッファの様な場合)、 vectorの要素コピーはoperator = ()よりswap()のが早そう。 以下チョーいい加減な検証プログラム。 #include <cstdio> #include <cstdlib> #include <string> #include <vector> typedef std::vector<std::string> Strings</std::string></vector></string></cstdlib></cstdio>…

参照の初期化と初期値代入を一行で。

C++

int value; int& ref = value = 0; // 一行で。 refをvalueで初期化したあと、refの指す値を0にセット。 int& ref = value; ref = 0; と書きたくないだけです。 もしかしたら嫌われる書き方かもしれない。 なんせ書いてる自分もちょい怪しい気分なので…でも…

vectorで表現するstring。

vectorで表現するstringを、vstringと呼んでみるテスト。 typedef std::vector<char> vstring; コレで何がしたいのかと言うと、C文字列を表現したいのです。 ヌル文字で終端するアレ。 何故かと言えばやっぱり、可変長配列だから。 ほとんどの(凡人)プログラマがst</char>…

構造体名と関数名に同じ名前を使う。

C++

そもそも宣言や定義時は何も考えず同じ名前で書ける模様。 構造体の方は、structキーワードで修飾すれば変数の宣言や定義が出来る。 #include <iostream> // Hoge構造体 struct Hoge { Hoge() { std::cout << "Constructor Hoge" << std::endl; } }; // Hoge関数 void </iostream>…

実数の角度を0〜360度に収める。

#include <iostream> #include <cmath> // for fmod float roundDegree(float x) { if (x >= 0.f) { return fmod(x, 360.f); } else { return 360.f - fmod(-x, 360.f); } return x; } int main() { std::cout << roundDegree(10.f) << std::endl << roundDegree(120.30f) << </cmath></iostream>…

読み終わった書籍をつらつら書いて行こうかと。

ゲーム、ラノベ同様に技術書も積み本する人ですが、最近崩し始めました。Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)作者: スコット・メイヤーズ,小林健一郎出版社/メーカー: ピアソン・エデュケーション発売日: 2006/04/29メ…

private継承

C++

private継承の振る舞いメモ。 // 基底クラス class Base { public: int _publicData; void PublicFunc() {} protected: int _protectedData; void ProtectedFunc() {} private: int _privateData; void PrivateFunc() {} }; // private継承したクラス class …

テンプレートに文字列を渡してみる。

C++

テンプレートパラメータに指定できるもの - Faith and Brave - C++で遊ぼう にある通り、テンプレートにはポインタが渡せると言う事で、 以下の様に文字列等を渡してみる。 #include <iostream> // 文字列 (char*) char hoge[] = "hoge"; static char fuga[] = "fuga";</iostream>…

クラステンプレートのメンバ関数テンプレートを外部で定義する。

C++

// 元のHogeクラステンプレート。 template <class T> struct Hoge { // メンバ関数テンプレートを宣言する。 template <class U> void Fuga(U val); }; // 定義。templateを二つ重ねて指定する! template <class T> template <class U> void Hoge<T>::Fuga(U val) { std::cout << "fuga;" << val <</t></class></class></class></class>…

静的リンク。

殴り書き。 適当にパスの通ってるところ/hoge/lib/にlibhoge.aとlibhoge.soがあった時、 gcc ... -lhoge と書いてリンクさせると、libhoge.soがダイナミックリンクされるっぽい。 静的リンクさせるには、 gcc ... /hoge/lib/libhoge.a と書くと、静的リンク…

mapの内部型とか、for_eachする時のファンクタ定義とか。

どれがどの型を指すやらわかりづらいんです。 typedef std::map<int, std::string> Map; Map::key_type key; // キーの型。int。 Map::mapped_type val; // マップされた値の型。std::string。 Map::value_type ele; // 要素(?)型。std::pair<const Map::Key_type, Map::mapped_type>。 // for_each用のファンクタ。 Ma</const></int,>…

multimap

気が付けば年末ですね。 年末でサプライズイベント発生でやや戸惑いました。 ホントに色々あった一年だったな。 multimapってあんまり使うケースが無くて、 馴染みが無かったので一つメモ。 特定のキーに関連づいた要素を列挙するコード。 #include <map> #includ</map>…

std::mapのインデクサとinsert

mapの挙動でメモメモ。typedef std::map Map; Map map;// operator []は要素が無ければ挿入される map["hoge"] = 0; map["fuga"] = 1;printf("hoge=%d\n", map["hoge"]); printf("fuga=%d\n", map["fuga"]); 単純に要素が無ければ挿入する処理を今まで以下の…

リストのDiffを取る。

二つのリストA、Bの要素のDiffを取って、 Bに無い要素は−リストに、Aに無い要素は+リストに追加する処理。 要素がソート済みな事が条件になっちゃいますが。 #include #include #include int main() { std::vector A; std::vector B; A.push_back(0); A.pus…

二つのベクトルを徐々に重ねる。

あるベクトルPを、あるベクトルQに重なるように、徐々に変化させる計算方法。 補完とかとはちょっと違う感じ。媒介変数とかは使いません。 変化のさせ方は、ベクトルPとベクトルQのなす平面に垂直な軸に対して、 回転させてPとQの成す角を近付けていく感じ。…

オンラインゲームで良く見かける頭上名前表示をやっちゃおうというハナシ。

一般的な名称は知らないので、この記事ではネームプレートと勝手に呼ぶ事にします。 とりあえずこのネームプレートの条件としては、1. 常にカメラに対する向きを向く四角形の板ポリゴン(ビルボード)。 2. 奥に居るキャラのネームプレートでも同じサイズで…

Direct3Dの射影変換行列。

多くのDirect3Dプログラマは、射影変換には↓の関数を使っているんじゃなかろうか。 D3DXMatrixPerspectiveFovLH( D3DXMATRIX* pOut, float fovY, // Y方向の視野角 float aspect, // 画面のアスペクト比 float zn, // ビューボリュームの近平面までの距離 fl…

using namespaceの範囲。

C++

今のプロジェクトはネームスペース使いまくりんぐで、 using namespaceの効果範囲は如何ほどなのだろうと思ってちょっとテストしてみた。 ケース1 #include namespace { // このファイル全てのスコープで有効になる using namespace std; string s; // OK }…