Codelogy

2009年04月21日

32ビット環境で64ビット整数を扱う (減法編)

32ビット環境で64ビット整数を扱う (加法編) の続き。
今回は、加法のコードに少し手を加えて、減法を行う関数を作成します。

2009年03月11日

カウンタ付き参照

C++ では、new を用いてオブジェクト (メモリ領域) を確保したならば、これを delete でを明示的に解放してやらなければなりません。 この「借りたもの (メモリ) は自分で返す」という硬派なスタイルは非常に C++ らしく、またパフォーマンスの面でも優れるため、個人的にはとても気に入っています。

その一方で、このスタイルにはメモリリークや二重解放によるアクセス違反, ダングリング・ポインタの発生とった問題があり、致命的なバグの原因となりがちであることも事実です。 また、プログラムの性質上、オブジェクトが利用されなくなるタイミングが予測しづらく、明示的な解放を記述することが原理的に困難であるような状況というものも存在します。

C/C++ 以外の殆どの言語はガーベジ・コレクションを言語仕様として採用することでこうした問題を回避しています。 特に、ガーベジ・コレクション手法の一つである参照カウントは、その動作原理が非常に単純であり、またそれ故に (一般的な状況下における) パフォーマンスにおいて他の手法よりも優れています。 そこで、この参照カウントの仕組みを C++ でも利用できないかと考え、Reference というクラステンプレートを作ってみました:

ソースコードは上記リンク先のページからダウンロードすることができます。

今回はこの Reference クラステンプレートの使い方について簡単に説明します。

>> 続きを読む...

2009年02月17日

C++ スタイルのキャスト

C言語では、キャスト (型変換) を以下のような形式で行います。

( type ) expression

この記法では、どのような種類のキャストが行われるのかを明示したり、不正・危険なキャストに対してチェックを行うことができないという問題があります。
そこで、C++ では static_cast, dynamic_cast, const_cast, reinterpret_cast の 4つのキャスト演算子が導入されました。 今回は、これらのキャストの使い方について解説していこうと思います。

>> 続きを読む....

2009年02月08日

Ruby でローカルスコープを作る

必要に迫られて、ローカルスコープを作り出す関数を作ってみました。

>> 続きを読む...

2008年12月19日

リニューアル計画中

現在、サイトリニューアルを計画中です。
このURL (http://www.codelogy.org/) はこのまま使用する予定ですが、一足先に見たい、という方はこちらへどうぞ。

2008年11月09日

エスケープは出力時に

CGIプログラムは、HTMLを出力とすることが多い (というか殆ど) ため、入力データに対して HTML エスケープを施すものが多く見られます。
入力部
cgi    =CGI::new()
title  =CGI::escapeHTML(cgi.params['title'])
artist =CGI::escapeHTML(cgi.params['artist'])
asin   =CGI::escapeHTML(cgi.params['asin'])
出力部 (eRuby)
<table>
  <tr>
    <th>タイトル</th>
    <td><%=title%></td>
  </tr>
  <tr>
    <th>アーティスト</th>
    <td><%=artist%></td>
  </tr>
  <tr>
    <th>購入</th>
    <td><a href="http://www.amazon.co.jp/dp/<%=asin%>">Amazon.co.jp<a></td>
  </tr>
</table>
実行結果 (HTML出力)
<table>
  <tr>
    <th>タイトル</th>
    <td>American McGee's &quot;ALICE&quot; (Original Music Score)</td>
  </tr>
  <tr>
    <th>アーティスト</th>
    <td>Chris Vrenna</td>
  </tr>
  <tr>
    <th>購入</th>
    <td><a href="http://www.amazon.co.jp/dp/B00005OB0J">Amazon.co.jp<a></td>
  </tr>
</table>

HTMLのタグや属性の記述に使用される <, >, &, " といった特殊文字をエスケープすることで、クロスサイトスクリプティングなどの不正な出力を防止しているわけです。 このような、入力時にエスケープ処理を施す手法は多くの書籍・サイトなどで紹介され、実際に公開されている Web アプリケーションにおいても広く用いられています。 しかしながら、この手法には大きな問題点があります。

>> 続きを読む...

2008年09月27日

FBXファイルを読み込む(スキン情報の取得)

松浦さんから依頼を受けて、Autodesk Maya 等の .fbx 形式からMicrosoft DirectX の .x 形式に変換するスクリプトを書きました。
FBX形式の仕様は膨大で、予想していたよりもずっと大掛かりな作業となってしまいました。
これからFBX SDKを扱う人の助けになることを祈って、解説記事を書くことにします。

>> 続きを読む...

2008年09月26日

モーションキャプチャデータの使い方(計画編)

前回予定していましたFBX形式からメッシュやマテリアル情報を抜き出す方法ですが、FBXSDKのドキュメントがあまりにも、以下略であるため、断念しました。
簡単に理由をあげますと、クラスの説明がたったの英語5単語であったり、関数名がGetなのに説明がSetだったりとすさまじいものがあります。
ですので今回はFBXはおいておき、モーションキャプチャデータであるBVHファイルの利用方法を考えてみたいと思います。
これに対応できるMax,Mayaプラグインを近日に書きたいと思っています。
既に合成を終えたわけではありませんので、間違っている部分があるかもしれません。
その部分は合成が終了しだいプラグインのソースコードと一緒に公開したいと思います。

>> 続きを読む...

2008年09月04日

32ビット環境で64ビット整数を扱う (加法編)

通常用いられる整数型 (32ビット符号付き) は -2,147,483,648 ~ 2,147,483,647 の範囲の値を表現することができます。
殆どのアプリケーションにおいては、この制限が問題になることはまずありません。
しかし、この範囲を超える値を扱う必要のあるアプリケーションも存在します。

そこで考え付くのが、32ビット環境で64ビット整数を扱うための仕組みを作ることですが、実際にやってみると意外なほどに手間が掛ってしまいます。
この記事では、四則演算・10進出力などのプログラムを組むときの手順や考え方について解説していきます。

64ビット整数の表現

まず、64ビット整数を表現するための構造体を定義します。
DWORD (unsigned long) 組み込みの整数型は最大で32ビットまでなので、これを 2つ組み合わせて64ビット整数を表現します。
#ifndef __QWORD_H__
#define __QWORD_H__

//32ビット整数
typedef unsigned long DWORD;

//64ビット整数
typedef struct {
    DWORD dwLow;  //下位32ビット
    DWORD dwHigh; //上位32ビット
} QWORD;

#undef //__QWORD_H__
//[EOF]
メンバ dwHigh の最上位ビットは符号ビットとして利用しますが、この段階では特に気にする必要はないでしょう。

>> 続きを読む...

2008年09月01日

連結リストを作る (1)

C/C++ の配列は、そのサイズをコンパイル時に決定する必要があります。
そのため、サイズが動的に変化するデータの格納が少々面倒だったりします。

そこでよく用いられるのが、連結リストと呼ばれるデータ構造です。 殆どの環境ではライブラリとして提供されていますが、勉強もかねて自分で実装してみましょう。

設計

コードを書き始めるまえに、簡単な設計を行いましょう。
この段階では詳細には立ち入らず、データの構造をおおまかに決定すれば十分です。(図 1)

【図1: 連結リストの構造】
リストを構成するノード (node) はそれぞれ、自分の前後に位置するノードのアドレスをメンバ変数 m_lpPrev, m_lpNext に保持します。 (始端ノードの m_lpPrev および、終端ノードの m_lpNextNULLとする)。

リストの本体 (list) は、始端および終端ノードのアドレスを m_lpHead, m_lpTail として保持します (リストが空の場合は、m_lpHead, m_lpTail は共にNULLとする)。

だいたいの構造が決まったら、いよいよ実装を始めます。

>> 続きを読む...