プログラミング

複数の配列をひとつのループで処理したい 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 点でもう…

Polyline で憤死

高々 5 万点程度のデータを Polyline 使って線を描くと処理が戻ってこなくなります。ペンの幅が 1 ピクセルなら問題ないのですが、 2 ピクセル以上になるともう駄目。調べても何も出てこないし Polyline 自体のドキュメント (MSDN) にもなにも書いてない。国…

使っていないとすぐ忘れてしまう

Ruby で何か書こうとする度に for 文の構文を調べている気がする。 array.each { |e| puts e } みたいなのは体が覚えたので勝手に指が動くんですが。C++ なんかはしばらく触らなくても、いざとなったら思い出す手間も無く使えているので、やっぱりある程度使…

Ruby での数値計算

結構色々できるらしい。週末にでも読んでみたい。 Rubyist Magazine - Ruby Library Report 【第 5 回】 数値計算と可視化 Ruby for Science 可視化までできると言われたらもう使うしか。

enum で定義された値を foreach でこねくり回す

列挙体を列挙しちゃうよ! なんて……。 public enum Sample { A = 100, B = 200, C = 500 } class Program { static void Main(string[] args) { foreach (int n in Enum.GetValues(typeof(Sample))) { Console.WriteLine(n); } Console.ReadLine(); } }C# で…

フリー関数を活用しよう

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

NUnit

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

EXE サーバできた

プロジェクトオプションを変更して、一度クラスライブラリを生成してからレジストリに登録されている値を比較してみたところ、クラスライブラリのほうは CodeBase というキーに生成した dll のパスが入っていて、どうもこれが exe の時に設定されていなかっ…

アプリケーションを ROT(Running Object Table) に登録する

.NET2.0 の場合、 IRunningTableObject を使用すれば良いようです。これは .NET2.0 から追加されたクラスで、それ以前の場合は UCOMIRunningTableObject になるようですが、使い方はたぶん、大体同じ。なので .NET1.0 でのサンプルでも、 UCOMxxx の UCOM を…

exe サーバ

C# で、というか .NET Framework で exe サーバって作れないんでしょうか。クラスライブラリならプロジェクトプロパティの「COM 相互運用機能の登録」とすると何もしなくても外からライブラリの中で定義したクラスを扱えるみたいですが、普通の exe を作ると…

VBScript で COM

VBScript でなんか適当なオブジェクトを CreateObject で生成して、そのオブジェクトのメソッドを呼び出すと「オブジェクトがありません (800A01A8)」というエラーが出てしまう。 JScript や、 Ruby32OLE を使用すると問題なく呼び出せるので VBScript 固有…

B-spline

ラグランジュより仕事で使っているものを理解しておいた方が良いかと思うので次は B スプライン補間をしてみます。 B-Spline -- from Wolfram MathWorld 式を見て初めて B スプラインは外挿を行えない理由がわかりました。ただ、ノットベクトルの方がよくわ…

ラグランジュ補間

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

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

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

C# はオブジェクトの生存期間 (スコープ) を定義できる

あんまり C++ に偏ってもいけないか……ということで。Java は知らないけれど(後で調べる) C# ではオブジェクトの生存期間を定めることができます。つまり RAII idiom は C# でもできたりします。>using System;namespace raii { class hoge : IDisposable { p…

Java や C# のデストラクタ

Java の場合はファイナライザ (Finalize) と言うらしいですが、これらは先ほど紹介したガベージ・コレクションの仕組みからして「いつ呼び出されるかわからない」といった特徴を持っているようです。真面目に使ったこともなかたもんで、こんな基本的なことも…

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

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

Garbage Collection のアルゴリズム

一般教養としてのGarbage Collection Garbage Collection のアルゴリズムの説明。ためになります。 Reference Counting 方式しか知らなかったのですが、 Tracing GC の方がよく使われているのですね。また C 言語での GC の実装があることもはじめて知りまし…

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 も割と使われるようになってきているようなので啓蒙しておいた方がいいかもしれない。