プログラミング

複数の配列をひとつのループで処理したい in C#

元ネタ : 複数の配列をひとつのループで処理したい - ベイダー日記定期的に欲しくなるので複数の配列を受け取って要素をひとつずつ返すようなメソッドを作りました。手元の環境はC#2.0で拡張メソッドなんてないので以下のようなメソッドをどこかのユーティリ…

メモリ確保

・めもりかくほ C onlyでわりと規模の大きいときは呼び出し元で確保するとして, 最初にポインタをNULLにして渡すと必要なサイズだけが返ってきて改めてそのサイズを確保して呼び出すというのが一番安全かな. でもその手順を毎回書くのは面倒だから呼び出し先…

CrashFinder

アプリケーションの動作確認をしている時に実行時エラーが発生したのですが、デバッガで止まるところがどうも怪しく原因がさっぱりわからないという事態に陥ってしまったので、エラーメッセージに含まれるアドレスから本当にエラーが発生している箇所を探そ…

複数の配列をひとつのループで処理したい

A, B, Cという配列があって、中に持っているオブジェクトの型が同じである時に、 foreach (HogeType h in A, B, C) { h.do() } みたいな感じで、Aの要素を全部走査したら次はBの要素に……という風にしたい。こういうのをサポートしている言語ってあるんでしょ…

C#でLoadLibraryを使用してアンマネージDLLを使用する

C#(.NET)でアンマネージDLLを使用するには、DllImport属性を使用するのが記述量も少なく、面倒なことを考えずに済むので一番楽だと思います。 [DllImport("user32.dll")] private static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaptio…

演算子の優先順位

if (hoge || foo && bar) { // ... } &&演算子の方が優先度が高いため、上記のコードは if (hoge || (foo && bar)) { // ... } と解釈されるが、自分の脳内ではなぜか if ((hoge || foo) && bar) { // ... } となっていたためにしょぼいバグを生んでいた。欝…

Visual Studioのデバッグ機能(Edit and Continue)

これはすごい。デバッガからアプリを実行している時に未処理の例外が発生するとデバッガは例外が送出されたところで停止するけれど、その時点で例外が発生する原因のコードが近くにあれば、そこを修正してから少し巻き戻して再実行すればそのまま通るように…

TDDはIDEの助けが必要だなあ

と、思いました。なんだかんだでC++ BuilderでTDDは面倒くさくてあまりやる気になれなかったんですが、Visual Studio(C#)の方は昨日のUnitRunとNUnitのおかげで簡単にテストができるので自然とテストを書こうという気分になれます。ツール重要だなあ。という…

プライベートメソッドのテスト

C#でprivateなメソッドをテストしたい時ってどうするのが定石なのだろう。C++では、#define private publicなんていう恐ろしい手があるらしいですが、C#だとリフレクションとか使って頑張るしかないのでしょうか。リフレクションまだ勉強してないのでさっぱ…

message_once

最速インターフェース研究会 :: Developer Enviroments Conference で発表してきましたにて公開されている資料にalert_onceというJavascriptで書かれた関数がありました。ループ中に何かエラーがあった時にメッセージを出したい、けど、ループ中にたくさんエ…

数学関数のエラーを処理する _matherr 関数

数学関数の引数に不正な値を与えるとエラーが発生しますが、_matherr関数を定義するとエラーが発生する直前に処理することができます。注:以下の記述はBorland C++ Compilerにて確認を行っています。環境によっては関数名や定数名が違ったり(gccではアンダー…

テキストファイルを読み込んでSTLのコンテナに格納する

たまにやろうとした時にいつも忘れてるのでメモ。 int main() { std::string text; std::ifstream ifs("hoge.txt"); text.assign(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>()); return 0; } ちょっとしたファイルを読む時にはそれなりに使え</char></char>…

C++ Builderで、DLLのデバッグにPythonを利用する

PythonでDLLのテストを行うコードを書いて、もし実際にバグが見つかっても、そのバグの原因がどこにあるのかまではこの方法だと分からなくなってしまいます。それだとデバッグしたい時に不便なので、PythonでDLLをロードした時にデバッガからDLLを起動する方…

C/C++で作成したDLLのテストをPythonで行う

C/C++でDLLを作成した後、そのDLLの動作確認を行うには別途プログラムが必要になってきますが*1、それにまたC/C++を用いるのはあまり効率が宜しくないと前から思っていて、スクリプトを使ってもっとお手軽にしたいと考えていたのを少し実践してみました。な…

テンプレートパラメータを省略した時の動作

// Macにはまだcpp_to_hatenaが入ってないので色分けが... cout 上記のようなコードをBCCでコンパイルして実行すると、どちらも結果が「6」になります。つまり std::max とみなされているんだと思いますが、これは規定の動作なのでしょうか。そこに落ちてい…

メソッドチェーンを使用した名前付き引数の実装

メソッドチェーンというのは、関数の戻り値としてオブジェクトを返すようにして、その戻り値のオブジェクトのメンバ関数を直接呼んで関数呼び出しを繋げていく様なコードの書き方を指します。のですかね? ……ちょっとその辺はよくわからないのですが、ともあ…

配列や構造体の初期化

配列や構造体は、以下の構文で初期化することができます。 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 変数は存在する }

windowsx.h

最近知ったんですが、 windowsx.h という Windows プログラミングに役立つ C(C++) のマクロがたくさん定義されているファイルがあるそうです。軽く覗いてみましたが、なかなか使えそうです。例えば GDI オブジェクトをデバイスコンテキストに関連付けるのに…

名前重要

Get というメンバ関数がある。何を Get するというのだろう。 ConditionChange というクラスがある。何のコンディションを変更するというのだろう。もうちょっとまともな名前を付けたほうが、後々いいのではないかと思うわけですが。Get というメンバ関数を…

|| 演算子

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

CodeGuard のおせっかい

どうやら以下の配列の先頭アドレスを引いたものに対するアクセスは未定義らしいです。ので、以下の手法は使用しないでください。 どうも配列の先頭アドレス -1 を行って得られる値 (アドレス) が全然関係ないメモリアドレスになってしまう可能性があるそうで…

DrawLines でのパフォーマンス低下

理由が良く解らないのだけれど、アンチエイリアスを有効にして (Graphics.SetSmoothingMode(SmoothingModeHighQuality)) 、 X 座標がソートされていない (でたらめに入っている) ポイントの配列を DrawLines に突っ込むと描画処理が異様に遅くなることがある…

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

Graphics.DrawLines

GDI+ の Graphics.DrawLines って遅くないですか?1 万点超えるとかなりパフォーマンスが悪くなってくるような。 10 万点程度でしばらく戻ってこなくなります。ご指定のページが見つかりません には 100 万点あっても 1,2 秒で描けるよ! とか描いてありますが…

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

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

RELAX NG を Perl から使う

XML::LibXML に RelaxNG を扱うためのインターフェイスもちゃんと用意されていますね。ということでコマンドラインから簡単に RELAX NG を使って XML のチェックをするためのスクリプトを書いてみました。 #!/usr/bin/perl use strict; use XML::LibXML; sub…

ペンの幅が 2 以上のときの Polyline の描画時間

単に描画が完了するまでに時間が死ぬほどかかっているだけなのだろうか。調べても何も出てこないので、少し点数を減らして計ってみた。どうやら時間はかかるものの待っていれば一応終わるようだ。 描画点数 描画時間(秒) 10k 5 15k 25 20k 77 20000 点でもう…