きままにブログ

プログラミングを主とした私のメモ帳です。寂しいのでコメントください笑

2014-01-01から1年間の記事一覧

placement newを使ってLuaで確保したメモリに上書き

ユーザーデータを使うとき、Lua側でメモリ管理をしてもらうためにlua_newuserdataを使う。その戻り値は確保した先頭のポインタであるため、これをnewの引数にとってPlacement newを行う。 int FDTDLua::L_createMaterial(lua_State* L) { auto self = (FDTDL…

クロージャーを纏めて登録

C++の関数をLuaから呼び出す C++をLuaから呼び出す際、C++側のクラスのなかのメソッドを呼び出したい場合、そのクラスのポインタが必要となる。グローバル変数に代入するのは気持ちが悪いので、Luaのクロージャーにポインタを記憶させ、関数が呼ばれるたびに…

LuaとC++の連携

Luaのプログラム例 まずはLuaで次のようなことをしてみたいと思う。 moc = MOC.new(); moc2 = MOC.new(); function func(x) setNumber(x); moc:set(x); moc2:set(x * 2); return x * x; end function call() x = getNumber(); print("x is " .. x .. "\n"); …

テンプレートで関数のインターフェイスを規定

C++

規定の抽象クラスBがあって、これを継承してクラスCがある。このとき、基底クラスBのメソッドfuncをクラスCで公開したいが、部分的な処理だけを派生クラスで定義し、funcの外枠はBで定義したい例。 #include <iostream> using namespace std; template <typename T, typename ...Args> class B { publ</typename></iostream>…

設計が悪い、やり直し

C++

事案 遺伝的プログラミングを実装したい 条件をクラスで定義し、それに基づいて構文木を出力する ノードは条件、行動の2つからできているが、後々拡張する可能性がある 想定する実装 template <typename T> class GPCase { // ランダム生成 // 交叉 crossover // 逆位 in</typename>…

ランダムな木

C++

再帰的にその都度乱数を生成してランダムな木を作るテスト。遺伝的プログラミングの最初の個体生成に使うために実験したものです。もっと良いアルゴリズムがあるはずですがとりあえずこれで行きましょう。 namespace { void rec(int size, int c = 0) { std:…

gotoかわいいよgoto

C++

C/C++ではgotoが使える。とても自由なこの制御構文は、2重のforループを抜けるとき大変役立つ。 #include <iostream> using namespace std; void func() { cout << "In func()" << endl; goto exit; cout << "skip" << endl; exit: cout << "End of func()" << endl; }</iostream>…

なんとなくクイックソート

C++

そういえばクイックソートを書いたことがなかった(気がする)。 ピボットを選択する。(ここでは要素のまんなかの場所を指定した。) ピボットより大きいものを右、小さいものを左に並べる その大きいもの、小さいものの中で1.を繰り返す 問題は、ある値を境に…

ジェネリックとテンプレート

C#(やJava)のジェネリックとC++のテンプレートは、型をパラメータ化するという点では似ているものですが、前者は型をパラメータ化するのに対し、後者は型に基づいてコードを量産する(高級マクロのようなもの)から全く異なるものです。C++で書いていて、テン…

識別子の命名則

基本的に私は以下のルールに基づいて変数名等の名前を決めています。 その言語のライブラリ等に従う。 特に決まっていなければ、 名前空間・クラス名は大文字から初め、名前の区切りを大文字で書く。(ex. MovingWindow) マクロ名(constは違う)、enumによる定…

excellVBAでCSVファイル出力

Excellでロボットのシーケンス制御を書き連ねたCSVファイルを出力しようとしました。ちょっとしたジャンプとタイマーとフラグ制御で誰でも編集できるものですが、保存しようとすると警告が何度も出ます。これはCSVファイルがExcellの全てのデータを保存でき…

STATICコントロールのリサイズ

分割ウィンドウの表示例 今遊んでいるダイアログ CreateWindowでウィンドウを生成するときにスタイルでWS_SIZEBOXを指定すればリサイズできる枠がつきます。その枠をドラッグしたりすると通常、ウィンドウのサイズが変更されます。ところが、STATICコントロ…

JavaScriptスレがすごかった

JavaScript 3でのとある会話。 160 デフォルトの名無しさん [] 2014/01/19(日) 12:48:15.65 ID: Be: jQueryで下記のように所持しているツリー用のデータをkeyを指定してtitleを変更する 処理を作りたいんですが、どのようにしたらいいでしょうか? 子が何階…

fwriteのシークが移動しない!?

C

事案 あるファイルのm行目のn列目以降(任意の位置)に文字列を挿入したい。 そのために、ファイル全体を挿入する文字列分だけずらしたい。 末尾からn[byte]ごとread & writeを繰り返して移動することにした。 コード(の一部) これはC++ではなくCであるため、s…

INIファイルの書き込み

C++

仕様 整数・実数・文字列をパラメータとしてとれるINIファイルの読み書きを行う。 テストフォーマット [section_name] parameterA = 100 parameterB[0] = 101 parameterB[1] = 102 [another_section_name] parameterC = 3.14 parameterD = "string" 制約 最…

ただの参照カウンタ方式のメモリアロケータ

C++

結局マーク&スイープを実装する予定だったのがただの参照カウンタ方式のGCとなってしまった。一応ソースを載っけておく。固定方式と変動方式がある。固定方式では断片化が発生せず、更にサイズの情報がなかったりフリープールが一定なので無駄な処理がないな…

インナークラスによる複数のインターフェース実装

C++

複数のインターフェイスがあって、それを実装するクラスCがあるとします。複数のインターフェイスを型によって使い分けたいとき便利な方法があります。以下のように実装をインナークラスに書き、変換演算子によって変換するというものです。 #include <iostream> using</iostream>…

仮想デストラクタ

C++

ポインタをdeleteするときに、基底クラスのポインタをdeleteしようとすると非virtualなデストラクタの場合、継承先クラスのデストラクタが実行されないというよくあるお話です。別にデストラクタに限らず、一般的なvirtual関数でもおなじ話ですが、特に明示…

やっぱりガベージコレクタについて考える

C++

アロケータの自作 やはりmallocやnewをしたあとfreeするのは時間がかかるようなので、もしも数多くのfreeが必要なデータを扱う場合はなるべくfreeしないで再利用する方がいいようです。そうなるとメモリープールの実装が必要となります。この際アライメント…

mallocとfree

C++

会社説明会にいってきました。学校がとてもつまらないく思えるほど早く働きたいと思いました。 本題 1万回int型をmallocしてfreeして、その時間を計測してみました。Core i3, Windows7(64bit)でVC++2013/32bitReleaseで実験しています。 int main() { LARGE_…

引数のデフォルト値

C++

template <class T> struct C { C(int x = 1); // ここに書く }; template <class T> C<T>::C(int x) { std::cout << x << std::endl; } 定義の方ではなく、宣言の方に書く(知らなかった)。</t></class></class>

C4346 : 依存名は型名ではありません

C++

template <class T> struct B { struct A; A* func(); }; template <class T> struct B<T>::A { }; template <class T> B<T>::A* B<T>::func() { // B<T>::A*は型名ではありません! return new A(); } Tが不明なため、B::A*もどういったものか分からないためエラーとなる。これが型であることを明示</t></t></t></class></t></class></class>…

全手動ガベージコレクタを作った

C++

マークからスイープまで全部自分で指定しないと動いてくれないガベージコレクタを作った。しかも1つのメモリ管理に付き1つの型しかつかえない。要はメモリアロケータなのだが、 static MemoryManager<int> mm; int main() { int c = 0; while(1) { auto& item = m</int>…

Luaでオブジェクト指向表記

Lua

Lua速習で述べたとおり、数々のテーブルへのシンタックスシュガーは、オブジェ言うと指向型言語のような表記をするために定義されています。これらを使ってオブジェクト指向のように書いてみます。 クラス表現 安易に考えられるのが、クラスとしてテーブルを…

速習Lua

Lua

Luaとは Luaとは、軽量スクリプト言語です。主にC/C++等に組み込んで使われます。組み込んだ方のアプリケーションをホストといいます。 Luaの特徴 Hello, world. print("Hello, world."); Luaは標準関数としてprintを持っており、標準出力に出力します。引数…

クラス(構造体)のゼロクリア

単に0に初期化したい場合 = { 0 }で初期化されることが規格で認められている。というのも初期化されていないメンバについては、0での初期化が再帰的に適応されるためである。 = { 1 }とした場合は最初のメンバだけ1で初期化され、他は0で初期化される。

例外安全

C++

RAII RAIIは、リソースはコンストラクタだけで確保され、デストラクタで解放されるクラス構成等を指す。つまり、コンストラクタ以外ではnewなど使わなければ良い。メンバを生ポインタとして持つと、複数の例外等によってコンストラクタから抜け出すときに解…

ドラッグできる子供ウィンドウ

ドラッグして子供ウィンドウを親ウィンドウの内部で動かせる。右クリックで削除できる。複数追加できる。まだ自動的に動くような処理は書いていないがひとまずWin32APIの勉強になった。途中、どうしても分からないバグがあったが、これはC言語何でも質問掲示…

コンテナクラスとコンテナの関係

C++

要件 あるコンテナクラスCCがあって、要素のクラスCをリンクリストとして可変子保持する。各クラスCは適当なタイミングで自身を削除したい。どうすべきか? 案 クラスCに親の参照を持たせ、自身の削除が必要になったところで親に自信を削除するように通知する…

左辺値と右辺値

C++

右辺値と左辺値 C++では式の型(T, const T, volatile T, T&, T&&)以外にもうひとつ式の値を分類する用語がある。いままで左辺値、右辺値といっていたような類いである。 int x; x = 3; いままではxが=の左側にあるからxは左辺値、3は右側にあるから右辺値と…