閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

C++

配列や構造体の初期化

配列や構造体は、以下の構文で初期化することができます。 int arr[10] = {1,2,3}; この時、配列の 0〜2 番目の要素は順に 1,2,3 で初期化されます。では、それ以降の 3〜9 番目の要素はどうなるのかというと、強制的に 0 で初期化されます。これを利用する…

ハンガリアン記法

間違ったコードは間違って見えるようにする - The Joel on Software Translation Project後半に、ハンガリアン記法の本来の用途が解説されている。ずっと、変数名に型情報を表すのがハンガリアン記法だと思い込んでいました。というかどこ見てもそう書いてあ…

if 文の式の中で宣言した変数のスコープ

if の式の中で宣言した変数は、 else 節の中(という表現でいいの?)では存在してないのかと思ったら……。>if(hoge* ptr = getPtr()) { cout << ptr->hoge(); } else { // このブロックにも ptr 変数は存在する }

|| 演算子

C++ では、 f(false || "hoge"); とした場合、関数 f には真偽値 (true) が渡されますが、JavaScript や多くの Lightweight Language では真となる方の値をそのまま返すようです。この例の場合は文字列が返ってきます。 // JavaScript alert(false || "hoge"…

Gdiplus::Matrix -> SetWorldTransform API

回転した矩形を描くのに、 Polyline だといまいち綺麗に線が出ません。仕方が無いので API を使うことにしました。 g.GetTransform(&mx); HDC hDC = g.GetHDC(); float elems[6]; mx.GetElements(elems); ::SetGraphicsMode(hDC, GM_ADVANCED); ::SetWorldTr…

GDI+ を使って座標変換

Graphics g(hDC/*どこかからやってきた DC*/); Matrix mx; mx.RotateAt(45, center_point); g.SetTransform(&mx); HDC hDC = g.GetHDC(); Rectangle(hDC, rect); g.ReleaseHDC(hDC); 世の中そんなに甘くないようで、上記のようなコードを書いても回転した矩…

'0' は真

しまった。bool flg = '0'; とした時、 flg 変数の値が false になることを期待してしまった orz'0' は 0 ではないので、 false にはなりませんよと。あーもうー。

コンテナの中から任意の値を持つ要素のインデックスを取得する

std::find で要素を検索して、返ってきたイテレータを begin() で引いてやればいい。 #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { vector<int> v; v.push_back(1), v.push_back(2), v.push_back(3), v.push_back(4), v.push_back(5); cout <</int></vector></algorithm></iostream>…

GDI+ を Borland C++ Builder (というか BCC) で使用する

図形を綺麗に描画したいということで、色々調べ物。現在は単純に GDI に WindowsAPI を使って線分やら矩形やらを描いているのですが、あまり綺麗ではないと言うことで、何か代替になるものがないか、と。順当に行けば GDI+ なのかなと思って調べてみたところ…

this が参照ではなくポインタである理由

C++

単純に参照ができる前に this ポインタができたからだそうで。 Why is "this" not a reference? Because "this" was introduced into C++ (really into C with Classes) before references were added. Also, I chose "this" to follow Simula usage, rather…

フリー関数を活用しよう

なんとなく C++ を使っているとクラスを使用しなければならないと言う意識を持ってしまいがちですが (自分が) 、 C++ は別に関数を定義するのにクラスに属している必要などなく、むしろ必要が無いのならば単なる関数として実装してしまう方がむしろ良い選択…

NUnit

基本的にいまのプロジェクトは GUI の絡んだコードばかり書いているのでユニットテストを行おうにも簡単にはいかず、結局ほとんど人力でやっているのですが、ちょっとした GUI の絡まないクラスを実装する事になって、ちょうどいいのでここだけ切り離して単…

ラグランジュ補間

突然ですがラグランジュ補間をします。式は以下。 が今日はじめて見たので読み方も意味もよくわからないんですが、とりあえず積和すればいいらしいです。式はなんとなくわかったので早速 C++ で実装。手元の本には C での実装も書いてあったんですが、自分で…

参照にしたからといって安全になるわけでもない

C++ の参照は必ず初期化が必要となる (必ず実体がある) ので、参照を取る引数はポインタを取る引数を違って引数が NULL かどうかを判断する必要がありません。……というようなことは色々なところで述べられています。それを理由にアドレスを引数に取る関数は…

Boehm GC (を Visual C++ 8 で使用する時のメモ)

早速使ってみましたよ。 A garbage collector for C and C++ から gc6.7.tar.gz をダウンロードして、解凍 お好きな Makefile を使ってビルドします。自分は VC8 を使用したので NT_MAKEFILE を Makefile にリネームして nmake しました さくっとビルド終了……

std::vector::erase の戻り値

C++ライブラリクイックリファレンス作者: レイリシュナー,Ray Lischner,クイープ出版社/メーカー: オライリージャパン発売日: 2004/07メディア: 単行本購入: 1人 クリック: 6回この商品を含むブログ (8件) を見るISO/IEC に準拠している C++ 標準ライブラリ…

erase-remove idiom

std::remove は実際には要素を削除しないよという話。 remove は第三引数と同じ値の要素をコンテナの末尾に移動して、残った要素の最後の反復子を返すだけなので、コンテナのサイズは変化しない。コンテナから本当に削除したければ erase を組み合わせて使う…

STLport の remove の件

id:wata_d:20060131 にはまる人が出てきた。 STL も割と使われるようになってきているようなので啓蒙しておいた方がいいかもしれない。

pure virtual function call

実行時にエラー (pure virtual function call) が出て死。久しぶりに見たと言うか、こんなエラーが出るはずは無いのだけれど……。基底クラスで純粋仮想関数呼ぶときに失敗するらしいけれど、普段はなんともなくって一度 delete してまた new した直後に出る。…

std::map をソート

久しぶりに map を使っていて、ふとキーを基にソートしようと思って std::sort に map を突っ込んだりしてしまった orz 。月曜なのでぼけていたということにしておこう……。

619 名前:デフォルトの名無しさん[] 投稿日:2006/04/07(金) 20:23:51 #include struct board { int p; int h; } main() { struct board a = { 0, 0 }; printf("%d,%d,%c", a.p, a.h); return 0; //右この部分に "互換でない型変換(関数 main )" とエラーが…

値を返す関数の戻り値を const 参照で受ける意図って

職場で見かけたソース。 struct st { int value; }; st get_st() { st s; s.value = 100; return s; } int main() { const st& s = get_st(); // これ return 0; } これって何か意味があるんでしょうか? 参照の有無に関わらずコピーコンストラクタ呼ばれてま…

その発想は無かった(-_-)

もらったソースに以下のようなコードがありました。 std::vector arr; for(int i = 0; i 一瞬何しているかわからなかった。着想がすばらしい、と少し思いました。さて、これは、突っ込むべきでしょうか。ていうか STLport の vector には引数を取らない push…

std::count 初めて使った

チェックボックスのチェック状態を bool の配列で管理しているのですが、この中でチェックされているものがいくつあるのかを調べるのに使ったりとか。 bool bCheck[20]; // ... size_t nCount = std::count(bCheck, bCheck + 20, true); あんまり出番なさそ…

フォルダ (ディレクトリ) のパスが入ってる文字列の階層を操作したい時は、一旦相対パスにするといい (かも)

たとえば "C:/hoge/foo/bar" みたいな文字列の内容を、 "C:/hoge/foo" にしたい、みたいな。下の階層のフォルダを示す場合は末尾に追加するだけでいいので何も考える必要はないのですが、上の階層に移動するとなるととたんに文字列操作が面倒くさくなります…

構造体のメンバをインデックスから取得する

#include using namespace std; struct container { double a; double b; double c; // ほんとはもっといっぱいあるの... } data; int main() { data.a = 1, data.b = 2, data.c = 3; for(int i = 0; i 構造体のメンバは同じ型で且つ POD じゃなきゃ駄目、だ…

Lambda

C++

http://public.research.att.com/~bs/N1968-lambda-expressions.pdf (via cppll) 最近まともにメールチェックしていないので気付かなかった。 C++ もまた盛り上がるのかなあ。 C++0x が出る頃には仕事で使う言語は C# に移行していそうだけれど。変数にも式…

素の C++ でも括弧で括れば型を指定しなくてもメソッドが呼べる

std::string a = "Hello ", b = "World."; std::cout "Hello World." 別に CLI とか関係なかった。

C++ で delegate

でっちあげてみた。 id:wata_d:20060309:1141873430 と同じ事を C++ で。 #include #include template class Delegater { std::vector > func_; public: Delegater() {} template Delegater(const U& f) { func_.push_back(f); } template Delegater& operat…

C++/CLI でなんか書いてみた

C++

C++/CLI でお遊びサンプルプログラムを書いてみました。画面作るのがちょう楽。 BCB がしょぼく見えるよ!gcnew は便利だけどなんか抵抗があるなあ。 C++ でガベージコレクタなんてっ。と言いつつ使ってみた。ポインタの代わりに使う記号「^」(←これなんて読…