きままにブログ

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

gotoかわいいよgoto その2

C++

enum class E { A, B, C }; switch(E::A) { case E::A: printf("処理A\n"); goto L; case E::B: printf("処理B\n"); break; case E::C: printf("処理C\n"); goto L; L: printf("A, C共通処理\n"); } printf("全共通処理"); これはなかなかいいと思うw

3項演算子とラムダ式

C++

こういうときってよくあります。 C c; const int x = 10; if(x > 10) { const C c1; c = c1; // コピーが発生 } else { const C c2; c = c2; // コピーが発生 } // cを使う でもこれだとconstを付けられません。このときよくある3項演算子の他に、ラムダ式で…

Project Euler Problem 3

13195 の素因数は 5, 7, 13, 29 である.600851475143 の素因数のうち最大のものを求めよ. 先ほど実装したOptionalと、LINQ for C++を用いて、簡単に求めてみました。素因数クラスは、インクリメントするたびに次の素数をOptional付きで返します。このため、…

Optionalを実装せよ

C++

Optionalは無効値を持った型です。Optionalを作るときに、メモリ確保は行わず、スタック上の変数に対してplacement newによって再配置を行います。そのためオーバーヘッドは少ないはずです。 テストケース 正の数の場合は値を返し、そうでない場合は無効値を…

LINQ for C++ライブラリを使ってみた

C++

ヘッダファイル1つインクルードするだけで使えるこのライブラリは、簡単に使えてちょっとした配列の操作にもいいかもしれないですね。 #include <stdio.h> #include <LINQ/cpplinq.hpp> int main() { using namespace cpplinq; struct student { char* name; int point; } list[] = { { </linq/cpplinq.hpp></stdio.h>…

《【質問】C++でソフト開発したい!【初心者】 >>317》の問題

1)縦横のそれぞれの列に1~6の数字が1つずつ入ります(ここは数独と同じ) 2)マス目にあらかじめ入っている(数字)は太線で囲まれたブロックに入る数字の合計を表しています 3)太線で囲まれたブロックの中には同じ数字が入ることもあります┏━━┳━━┳━━┳━━┯━━┳━━┓ …

Project Euler Problem 2

フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである. 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...数列の項の値が400万以下の, 偶数値の項の総和を求めよ. Project Euler Problem 1の追記で示したように、R…

Project Euler Problem 1

10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ. auto list = std::vector<int>(999); std::iota(list.begin(), lis</int>…

ネタ

自称C++使いですが、 http://d.hatena.ne.jp/Gemma/20080129 の要望に答えましょう。〔以下プログラム部分以外は殆ど引用です〕C++使いの人に、 関数型言語って何がすごいんですか と聞かれて、 じゃあC++で accumulator すなわち、数nをとり、「数iを取って…

Luaでnewuserdataして、それを利用しようとすると元のデータが破損している【解決】

エラーする状況 デバッグモードでたまにRTTI情報を持っていないと怒られる。 #include <iostream> #include <Lua53/lua.hpp> using std::cout; using std::endl; struct Object { virtual ~Object() { cout << "Object::~Object();" << endl; } }; struct C : public Object { int x; </lua53/lua.hpp></iostream>…

C++のキャスト

C++

なぜキャストが必要か? コンパイラは、あるメモリの最初のアドレスを知ったところで、それがどこまで続くのか、或いはどのメンバがどの位置に現れるかということを事前に知っていないといけません。そうしないと計算できませんからね。だから、ある変数xが型…

簡易メモリアロケータ―ちゃん

C++

概要 いわゆるリスト構造を1つ1つ繋ぐのではなく、複数個をまとめて繋いでいく形のリンクリストを際発明しただけのものです。freeもできて、そのポインタを後で再利用していきます。例外周りが適当です。有用な点は、どれだけメモリ確保しても元のデータのポ…

Luaの関数をC側で記録し、いつでも呼び出せるようにする

概要 例えば、関数myfuncをLuaで定義し、それを登録する関数registerMyFunctionおよび実行する関数doMyFunctionをC側で用意するとする。すなわち、テストコードは次の通り : local myfunc = function() print("test_code"); end registerMyFunction(myfunc);…

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>…