閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

programming

数学関数のエラーを処理する _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 固有…