c++

if括弧内で定義した変数の生存期間

c++

ifの括弧内で定義した変数ってelseのスコープでも有効なのね。知らなかった。 // hoge.cpp #include <string.h> #include <stdio.h> int main(int argc, const char** argv) { if(int len = strlen(argv[1])) { printf("then, '%s' len = %d\n", argv[1], len); } else { printf</stdio.h></string.h>…

cppcheckのバグ

c++

cppcheck-1.72で確認。 // hoge.cpp class Base { }; template<typename T> class Hoge<T[]> final : public Base { }; void func() { int a[2]; a[5] = 0; } $ cppcheck hoge.cpp Checking hoge.cpp... Hogeのfinal消すか継承を消すかT[]をTにするとちゃんと動く $ cppcheck </t[]></typename>…

VC2013が無名構造体のメンバに初期値を記述しても初期化してくれない

VisualStudio2013のC++11実装が甘い。 // hoge.cpp #include <stdio.h> struct Hoge { int one = 11; int two = 12; int sun = 13; struct named_t { int one = 21; int two = 22; int sun = 23; } named; struct { int one = 31; int two = 32; int sun = 33; } nona</stdio.h>…

RSA暗号書いてみた

https://github.com/shive/try_rsa $ make keygen python keygen.py P = fe03 Q = fc95 N = fa9ecbbf / log2(N): 31.9694 K = 10001 U = da17e869 (V = dec9) len(ORIGIN) = 22 b'\x8c\xc3\x92r\x82\xe2\x8a^\x82\xc6\x82\xd1\x82\xb1\x82\xde\x90\x85\x82\x…

呼び出し履歴を取得する

環境 Windows7 SP1 VisualStudio2012 SP1 SCons-2.3.0 やってみた main.cpp / SConstruct $ make run-x86 make run TARGET_ARCH=x86 make[1]: ディレクトリ `/home/github/shive/blogpost/20130918-stacktrace' に入ります scons -Qj4 TARGET_ARCH=x86 build…

boost with sqlite3

// -*- coding: utf-8-with-signature-dos -*- //============================================================================== #include <sqlite3.h> #include <boost/format.hpp> #include <boost/bind.hpp> #include <string> #include <iostream> #include <functional> using boost::format; using boost::bind; …</functional></iostream></string></boost/bind.hpp></boost/format.hpp></sqlite3.h>

boost勉強中

boostが楽しいassignとかlambdaとか便利やわ〜。 // -*- coding: utf-8-with-signature-dos -*- //============================================================================== #include <boost/lambda/lambda.hpp> #include <boost/lambda/bind.hpp> #include <boost/assign.hpp> // lambda/bind.hppと一緒にincludeする</boost/assign.hpp></boost/lambda/bind.hpp></boost/lambda/lambda.hpp>…

コメントアウトの切り替え

ふと思いついたpythonで#if/defのようなことをやる方法 C/C++:#if/defを使う #if 0 ... 無効 ... #else ... 有効 ... #endif #if 1 ^ .. 0->1に書き換え ... 有効 ... #else ... 無効 ... #endif C/C++:コメントを使う /* ... 無効 ... /*/ ... 有効 ... /…

pimplパターン+コンパイルタイムアサート

C++

pimplパターンは良く使うのだけれど、毎回newするのは如何なものかと思っていた。コンパイルタイムアサート使ってこんな風に書けばメモリブロックがひとつで済む。 hoge.h // コントローラ class Controller { public: Controller(); const char* name() con…

コンパイラの未使用変数警告を消す

C++

void fun(int num) { int val = getval(); } 警告レベルが高いとnumとvalで警告が出る。 void fun(int /*num*/) { int val = getval(); (void)val; } 引数んとこに書くなら変数名をコメントアウト関数内で書くならvoidキャスト。msvcもgccもこれでいける。

namespaceのインデント

namespace A { namespace B { namespace C { namespace D { namespace E { class hoge; }} class foo : D::E::hoge { }; }}} いま仕事で書いてるコーディングスタイルはこうなんですが、emacsのデフォルトだとnamespaceのインデントが合いません。ちょっと調…

複数の既存の.libから.dllを作る。

既存の静的ライブラリプロジェクトの数多くなりすぎてリンク時間が長くなってきたので、グループ化&動的ライブラリ化でリンク時間を短くしたい。ここ数日ずっとやり方を調べてたんですが、わかってみたらすごく簡単でした。やり方は、 ライブラリビルド時に…

C4251警告をまじめに対応してはまった

昨日の続き。C4251警告について。 [MSDN]'identifier' : class 'type' は __export キーワードを使って class 'type2' にエクスポートしてください。 class Context { public: static std::auto_ptr<Context> GetInstance(){ return s_singleton; } Context(); ~Conte</context>…

C++クラスライブラリ(.lib)をdllへエクスポートするときの注意

なんとなくそんな気がする程度しか確認していないメモ書きです。 C4251警告は無視するSTLなどtemplate/inlineで定義されているメソッドを確実なものにするためにexportしろって警告です。これにまじめに付き合うとえらい面倒なことになるので、定義されてい…

delegateの寿命

先日のid:NyaRuRuさんのツッコミを実際に試してみました。 //hoge.dll #include <stdio.h> extern "C" { typedef const char* (*message)(); static message s_fn = 0; __declspec(dllexport) void set( message msg ){ s_fn = msg; } __declspec(dllexport) void say</stdio.h>…

スレッドの作り方

C++

なんだかスレッドの調子が悪いな〜。動作が不安定。って思ってたらCreateThreadを使ってるのが原因だった。 Windowsでスレッドを作るには_beginthread,_beginthreadex,CreateThreadの3種類の関数がありますが、_beginthreadexを使うのがベターらしい。Creat…

squirrelとc++の速度比較

#pragma optimize("",off) static void dummyfunc(){}//最適化抑制のための関数 #pragma optimize("",on) struct Foo { int num; Foo() { num = 0; } void inc() { ++num; dummyfunc(); } }; Foo foo; for(int Li=0;Li<1000*1000;++Li){ foo.inc(); } O2でビ…

squirrelのデータをC++から簡単にアクセスする

モデルのポリゴンデータを.nutで記述するつもりなので、手始めにsquirrelのデータへのアクセスを容易にするためのオブジェクト&イテレータを実装してみた。 return { NAME="カイン" JOB="竜騎士" EQUIP=["グングニルの槍","クリスタルアーマー","リボン"] }…

仮想関数ポインタは4バイトとは限らない

c++

呼べました。なんてあっさりと。。。スタック上の値が0だったりCCだったりしたのはポインタのサイズが違ってて4バイト以上の余り部分が初期化されていないからなんでしょうね。これをsquirrelに組み込んでみます。いままでuserpointerの自由変数でやってた…

squirrelへのクラス登録、仮想関数テーブルがあるとNG

ベクトル組み込みはできた。コンストラクタによくあるオーバーライドに関してはメソッド名を変えることでスルー。他のクラスを登録しようとしたら、キャストにミスってるらしくvfptrがあるとうまくメソッドが呼ばれない。あとちょっと。。。 2008.09.16 追記…

squirrelへのクラス登録、引数と戻り値にC++型を使えるように

忘れてた。 class model { void setvisible(bool flag); bool isvisible() const; }; class loader { public: model& loadmodel(const char* path); }; vm.creg<model>("Model") .variable("visible",&model::isvisible,&model::setvisible); vm.creg<loader>("Loader") .fu</loader></model>…

consttable

consttableの存在がよくわからんかったのでここにメモしておきます。 enum hoge { one=1, two=2, san=3, }; const uuu=11; このenumとconstはroottableやregistrytableと並列に存在するconsttableへスクリプトコンパイル時に蓄えられます。ここでわからない…

続squirrelへclassバインディング

http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?rev=52&root=shive&view=rev だいぶできた。 //クラスを登録 creg<aaa>(hvm,"aaa") .function("getstatic",&aaa::getstatic) .function("somemsg",&aaa::somemsg) .function("getname",&aaa::getname) .function("</aaa>…

squirrelへclassバインディング

http://svn.sourceforge.jp/svnroot/shive/junk/diary/2008/20080906-test001.cpp 簡単なclassバインディング書いてみた。関数のオーバーロードとかちゃんとやるべきだろうか。必要になってから考えよう。メンバ変数へのアクセスも対応したいなぁ。

Google C++スタイルガイド

http://www.henshi.net/k/hiki.cgi?GoogleCppStyleGuide 例外を使わないようにしてるのは意外だった。書いてることが細かすぎる気がする。推奨だから別にいいんかな。 それはそうとは悪だ。なんでuintとかGetObjectとかdefineしとんねん。あれはいつになった…

fopen

//新規作成書き込み fopen("hoge.dat","wb"); //追記書き込み fopen("hoge.dat","ab"); この2つ、"hoge.dat"が存在しなければまったく同じ挙動をすると思っていたんですが、違いました。ゲームのバイナリデータはアラインメントをそろえないといけないので…

小ネタ

C++

enum hoge { one = 0, two, three, number_of_hoge, last = number_of_hoge - 1, }; number_of_hogeはenumの総数、lastは一番最後の値 struct hoge; hoge data[ 240 ]; int count = sizeof(data)/sizeof(data[0]);//=240 要素数を計算 /* 無効 /*/ 有効 //*/…

関数の戻り値の型

C++

#include <iostream> template<typename F> struct functrait; //引数0個の関数の場合 template<typename R> struct functrait<R(*)()> { typedef R Ret; }; //実際に使ってみる template<typename F> void printret( F fn ) { typename functrait<F>::Ret ret = (*fn)(); std::cout << ret << std::endl; } int foo()</f></typename></r(*)()></typename></typename></iostream>…