Codelogy

2010年02月07日

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

これまでの記事では、32ビット環境における64ビットの加法および減法について解説しました。 いよいよ、ヤマ場である乗法、すなわち「掛け算」のやり方について解説しましょう。

2009年12月04日

Array クラスを作る (size フィールド編)

Java では、配列の要素数をフィールド length を通じて参照することができます。

//合計の取得
int sum(int[] anData){

    int nSum =0;

    int i;
    for (i=0; i<anData.length; ++i){
        nSum +=anData[i];
    } //i

    return nSum;
}

この length は (おそらく) final int、即ち、変更不能な public フィールドとして定義されており、これに対する代入操作を行おうとすると、コンパイルエラーとなります。 ところで、この仕組みは Java が「配列のサイズは変更できない」という仕様を有するが故に可能なものであるということに読者諸兄はお気づきでしょうか。 もし配列のサイズが初期化後に変更可能であるとすれば、lengthfinal 修飾することはできません。 そうなると、length に対する代入操作を禁止する手立てはなくなってしまうのです。

一方、C++ ならば、値の変更が可能かつ、外部からの変更が不能なメンバ変数 (を模したインターフェイス) を定義することが可能です。 このエントリでは、このテクニックを使い、これまでのエントリで作成してきた Array クラステンプレート (参照) に要素数読み取り専用のメンバ変数 size を定義します。

2009年11月15日

ビット演算の基礎

ビット演算を使用すると、1つの整数型データをビット単位で区切って、複数の用途に割り当てることができます。 例えば、符号なし整数 (unsigned int) のデータ長さが32ビットの環境であれば、一つの変数で32個の真理値 (bool: true/false に相当) を格納することができます。 また、これらの真理値を複数個まとめて参照・操作することも可能です。

しかし最近のプログラミング環境では、潤沢なメモリやライブラリの普及などにより、ビット演算を利用するような場面は、以前と比べて少なくなっています。 そのため、ある程度長くプログラミングを学んでいるにも関わらず、ビット演算が使えない、あるいはその概念自体を知らないという人も見かけるようになりました。

というわけで、今回はビット演算の基本中の基本である、ビット値の参照・操作の方法とその手順について解説します。 ちなみに、当エントリの説明では図のスペース節約のため、8ビット符号なし整数 (BYTE: unsigned char) を操作の対象としていますので、実際に使用する場合は適当なデータ長に置き換えて考えてください。

2009年07月10日

参照の配列は何故作れないか

さて問題です。次のコードの実行結果はどうなるでしょうか?

#include <iostream>

using namespace std;

int main(){
  int a = 1, b = 2, c = 3;
  int &n[3] = {a, b, c};

  for(int i = 0; i < 3; ++i)
    cout << n[i] << ' ' ;
  cout << endl;

  return 0;
}

見出しを見た皆様のお察しの通り、正解は、「そもそもコンパイルされない」です。

code.cpp: In function `int main()':
code.cpp:7: error: declaration of `n' as array of references
code.cpp:10: error: `n' undeclared (first use this function)
code.cpp:10: error: (Each undeclared identifier is reported only once for each function it appears in.)

このように、C++では参照の配列を作成することは出来ません。
しかし、一体何故でしょうか? 参照の配列によって簡潔に記述できるような処理に出くわすこともままありますし、参照の配列を作ることが原理的に不可能であるとは到底思えません。 それなのに、何故禁止されているのでしょう?

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 アプリケーションにおいても広く用いられています。 しかしながら、この手法には大きな問題点があります。

>> 続きを読む...