サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ドラクエ3
www.s34.co.jp
stx::basic_symbol<T> より速い検索を行なうには… STLが提供するset(multiset)/map(multimep)は要素の大小関係に基づいてコンテナ内の要素を2進木上に配置します。このとき、挿入/削除/検索に要する時間計算量は(コンテナ内の要素数をNとして)logNです。 以下に示すコードは、int/stringをキーとするmapの検索に要する時間を計測するものです。 #include <windows.h> #include <iostream> #include <string> #include <map> using namespace std; const int N = 1000; int int_table[N]; string string_table[N]; void init() { char buf[32]; string key; for
ICU 2.x : UnicodeString による文字コード変換 ICU 2.x ではUNICODEによる文字列クラス UnicodeString が導入されました。 UnicodeString はマルチバイト文字列からコンストラクトでき、さらにメソッド extract でマルチバイト文字列に変換できます。 このふたつを用いて任意の文字コード間の変換を行なってみましょう。 マルチバイト文字列 → UnicodeString マルチバイト文字列からUnicodeStringすなわちUNICODEに変換するには: UConverter を生成し、UnicodeStringのコンストラクタに与える codepage文字列を UnicodeStringのコンストラクタに与える の2通りの方法があります。後者の方が実装が簡単ですが、これはUnicodeStringのコンストラクタ内でUConve
ICUの文字コード変換を使いたいのですが… 文字コードは日本に生を受けたプログラマの悩みのタネです。UNIX-serverとWindows-clientとの間でメッセージのやりとりを行うとき、そのメッセージがアルファベット(ASCII)だけなら何の問題もないのですが、漢字や仮名を含んでいる場合は片方が使っている文字コードを他方が使っている文字コードに変換してあげないと’文字化け’が生じます。また、SMTP/POP3などを介した電子メールなどではJISコード(iso-2022-jp)との相互変換が必要となります。さらにはXMLではUnicodeが使われますから… IBMのOpenSourceプロジェクト’ICU’は世界中で使われている数多くの文字コードとUnicodeとの相互変換を提供するライブラリです。’ICU’による文字コード変換を、現在最も広く用いられている2つのencoding:eu
sizeofの不思議 はじめに Cではsizeofによって構造体がメモリ上で占める大きさ(バイト数)を知ることができます。 struct s{ int x; int y; }; ... cout << sizeof(s) << endl; 僕の愛用する処理系、Visual C++ 6.0では 8が得られました。intひとつにつき4byteを消費するからでしょう。 それではC++でのclassの大きさはどうでしょう。内包するメンバ変数それぞれの占めるバイト数の総和になるのでしょうか。 class c { int x; int y; }; ... cout << sizeof(c) << endl; 答は…やはり 8 です。でもね、C++ではいつもこうなるとは限らないのですよ。 「C++はCよりデカい」と言われることがあります。その理由のひとつがここに明らかになります。 仮想関数 上記clas
はじめに 組み込みアプリケーション開発、特にセットトップボックス(STB)やデジタル家電、携帯電話などそれなりのUIを要求される製品の開発では、Webブラウザを搭載しユーザーインターフェース(UI)をHTML+JavaScriptで構築することがあります。この手法のメリットとして以下のようなことが挙げられます。 UIとロジックの分離 家電製品に搭載するような画面の動きをプログラマが全てコードで記述しようとすると大変です。UIをHTML(+CSS)で記述できれば画面作成はデザイナーにお願いし、プログラマーはロジックに集中できます。最後のUIとロジックの結合作業はプログラマー側に残りますが… 開発工数の削減 UIをHTMLで記述できれば、C/C++やJavaで記述するのに比べて開発効率の向上が見込まれます。それに伴い、工数削減、開発期間短縮が期待出来ます。 豊かな表現力、操作性の実現 ブラウザ
株式会社エス・スリー・フォーは、一人一人のスキルを重視したシステム・ネットワーク構築のプロフェッショナル集団です。蓄積されたノウハウと最新技術により、お客様が考えられているシステムを明確にし、ご提案させて頂きます。 開発ノウハウの一部を公開します 開発者の方々にお役に立つテクニカルドキュメントです。Articles、References、Miscelaneousに分かれて説明しています。初心者の方からプロの方まで役に立つ読み物と資料集です。是非、開発のお役にお立て下さい。 Articles : 読み物 C++の新しいキャスト 標準C++に追加された新しいキャストについて。 抽象データ型と Java/C++ そしてCOM/CORBA 抽象データ型の意味とJava/C++,COM/CORBAとの関係 時空を越えるオブジェクト シリアライズにまつわる様々なテクニック 時空を越えるオブジェクト p
Java/C++ではオブジェクト・インスタンスにメッセージを送ってその結果を受け取るとき、 result instance.message(parameter); のような記述となります。例えばPackからCardを一枚引き、Packに戻すJavaコードは: Pack pack = new Pack(); Card card = pack.deal(); // Cardを一枚引く pack.replace(card); // (引いたCardを)packに戻す 同様のことをCで行なうためのスタイルを考えてましょう。 まず、抽象データはその詳細を外部に公開してはならないので、ヘッダには構造体のポインタのみを公開します。 typedef struct card_struct* card; このとき、card_structの実際の構造(メンバ)はヘッダには明記せず、cardの実装部に置きます。
C++ 寄稿記事 επιστημη 氏から寄稿していただいた、開発者の方々にお役に立つテクニカルドキュメントです。Articles、References、Miscelaneousに分かれて説明しています。初心者の方からプロの方まで役に立つ読み物と資料集です。是非、開発のお役にお立て下さい。 Articles: 読み物 References: 資料集 Miscelaneous: 番外編
ゲートがLocked状態のとき: Coinイベントが発生したら、Unlocked状態に遷移してUnlockアクションを起こす。 Passイベントが発生したら、閉じているゲートを無理矢理誰かが通過したことに対しAlarmアクションを起こす ゲートがUnlocked状態のとき: Passイベントが発生したら、Locked状態に戻してLockアクションを起こす Coinイベントが発生したら、余分なお金を頂いた事に礼を言う(ThankYouアクションを起こす)。 状態遷移表のXMLによる表現 この状態遷移表のXMLによる記述は前作から少しばかり拡張されています。 文法 まず、状態遷移表をXMLで表現するための文法をDTD(Document Type Definition)で定義します。 これは今後いかなる状態遷移表をXMLで記述する場合でも再利用できます。 fsm.dtd : 状態遷移表の文法 <
ダウンロードとインストール CUnitは http://sourceforge.net/projects/cunit/ からダウンロードできます。 2003.06時点での最新版は1.1-0です。 zipもしくはtar+gzipで圧縮されているので、 適当なディレクトリに展開してください。 以下の説明はWindows/Visual C++ v6.0 環境で、 CUnitのルート・ディレクトリを<CUNIT>と表記します。 ライブラリのビルド CUnitはツール/ユーティリティの類ではありません。 テスト対象およびテストコードと一緒にリンクして実行モジュールを生成する’ライブラリ’です。 CUnitは様々なOS/処理系に対応しており、 その使用に先だってライブラリをビルドしなければなりません。 Visual Studio IDE から プロジェクト:<CUNIT>\CUnit.dsw をオープ
バイナリ/テキスト相互変換(BASE64とQuoted-printable) 電子メールによるバイナリファイルの送受信 インタネットの爆発的な普及に伴い、電子メール(e-mail)が至極アタリマエの通信メディアとして用いられるようになってきました。 e-mailはインタネットが今ほど一般的ではなく、コンピュータ間を公衆回線(一般電話網)を介して繋いでいた頃からのメディアです。ですから現在でもe-mailに含まれる文字は7bit-ASCIIであることが求められています。 文字だけの、いわゆる"お手紙"だけでなく、画像、音声、あるいはプログラムなどの"バイナリファイル"をe-mailでやりとりするには、送り手はバイナリファイルを構成するバイト(8bit=256文字)をASCII文字に変換し、受け手はそれを元に戻さなければなりません。 e-mail界で、バイナリ/ASCII相互の変換規則として一
STLport のハッシュ・コンテナ 標準C++ライブラリが提供するコンテナは、vector, list, deque, set, multiset, map, multimap の7種です。 これらコンテナから特定の要素を検索するとき、その時間計算量は vector, list, deque では O(N), set, multiset, map, multimap では O(logN) となります。 これ以上に高速な検索が可能なコンテナとしてハッシュ表(hashtable)を利用すれば、適切なハッシュ関数を与えることによって検索に要する時間計算量をコンテナ内の要素数に関わらず O(1) に近づけることができますが、残念ながら標準C++ライブラリにはハッシュ表で実装されたコンテナ(ハッシュ・コンテナ)を提供していません。 SGI(Silicon Graphics社)のSTL実装をベースに
TestRunner自動生成 (for CppUnit 1.6.2) 単体テストフレームワーク(UnitTestFramework): xUnit の解説書: 「eXtreme Programming テスト技法」 翔泳社 ISBN4-7981-0128-1 では、C++版xUnitのひとつ CppUnit-xを利用したUnitTestの手順について解説しています。 C++のテストをCppUnitで書くとき、最も面倒なのはテストスイートの構築です。 この本にはCppUnit-x によるテストケースを記述したヘッダを基にテストスイートを生成し、 そして実行するC++コードを吐くruby スクリプト ‘TestRunnerFactory.rb’ が紹介されています。 CppUnit-x 用のTestRunnerFactory.rb を本家 CppUnit 1.6.2で使えるように書き換えたもの
Refactoring C-code ここに挙げるリファクタリングの例は、 「リファクタリング」 マーチン・ファウラー トッパン/ISBN4-89471-228-8 に列挙されたJavaによるサンプルの中から、Cにも摘要できるものを選んだものです。(カッコ内の数字は該当ページを示します) すべてを必ず摘要しなければならないというものではありません。 より簡潔に/単純になると考えられるとき、正しく運用してください。 関数の抽出 (110)
multipart形式の例 MIME規格にしたがって複数のファイルをメールに載せるには、'multipart'を用いる。 例としてmessage.txtをJIS,binary.lzhとpicture.gifをBASE64でメールに載せるときのformatを以下に示す。ただし、message.txtはファイルとしてではなく、メールのメッセージとしてメールリーダが出力することを想定している。また、(*..)は注釈であり、メールの中には記述されない。 To: どこそこ Subject: どーのこーの From: だれそれ ... なんやかんや ... MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=NeverOccurred (*1) --NeverOccurred (*2) Content-Type: text
シリアライズってなに? シリアライズ(あるいはストリーミング)とは、オブジェクトの状態をバイト列に変換すること、そしてバイト列から元のオブジェクトを復元することです。バイト列に変換できればそれをファイルに保存することで、一旦終了したアプリケーションが再度起動したときに前回の状態に戻すことができますし、ネットワーク上で共有すれば複数のアプリケーションが同じオブジェクトを利用できます。また、変換されたバイト列をソケットやRS232Cに流し込めば遠く離れたマシン上で復元することもできるでしょう。簡単に言えばオブジェクトをファイルに書き込むこと、そしてファイルから読み込むことです。ソケットやRS232Cもバイト列の転送媒体と言う観点からは広義のファイルと考えていいでしょうからね。 Step-0:簡単なシリアライズ シリアライズなんて御大層な用語ですけど、要するにファイルに対するsaveとloadで
COMからのイベントを捕まえる方法 "見てくれ"を持たないCOMからのイベントの受理 Visual C++が提供してくれるATL(Active Template Library)を使うと、COM(Component Object Model)を簡単に作ることができます。 COMに発生した状態の変化をイベントとしてCOM利用者(Client)に通知したいことがあるでしょう。 この機能が提供されていないと、COMの状態変化を知りたいClientはCOMに対してメソッドもしくはプロパティを定期的にコール/取得しなければなりません。 Clientに対してイベントを発行する機能を持ったCOMを作るには、dispinterface(ディスパッチ・インタフェース)と呼ばれる接続ポイントを用意します。接続ポイントには、COMが発行できるイベントを定義しておきます。このイベントは、実際にはイベント毎にユニー
‘置換’はどうやればいいのですか? そうですよね、’検索’ができたならその次は’置換’でしょう。置換すなわち文字列のある部分を他の文字列で置き換えるのは、単なる’検索’より少しばかり複雑です。 charやwchar_t配列を文字列として用いている場合、’置換’はひどく面倒な処理が必要となります。’置換’によって文字列の長さが変わらないのなら何の問題もないのですが、文字列の一部をより短い文字列で置き換える場合、置き換える箇所の後ろに続く部分を短くなった分だけ前に詰めなくてはなりません。また、より長い文字列で置き換える場合、置き換える箇所の後ろに続く部分をより後ろにズラさなくてはなりません。困ったことにcharやwchar_t配列の長さを知ることができませんから、置換による領域あふれの危険が常につきまといます。 それに対し標準C++ライブラリが提供する文字列クラスstd::basic_stri
テンポラリ・バッファとしての std::vector の利用 悩ましきテンポラリ・バッファ 一時的に必要となる領域、すなわちテンポラリ・バッファはプログラムのいたるところで用いられます。 void f() { char buffer[256]; ... } 上の例では256[char]のbufferをautomatic領域に確保しています。 場合によってはこのような固定サイズではなく、可変長のテンポラリ・バッファを必要とします。可変長のテンポラリ・バッファが必要なとき、通常opeartor newによってヒープ領域から確保するでしょう。 void f() { char* buffer = new char[N]; // Nは変数 ... delete[] buffer; } 当然のことながら、operator newによってヒープから確保した領域は、利用後速やかにoperator dele
C++の新しいキャスト 従来のキャストの問題点 異なる型への変換において、C/C++ではキャストが用いられます。 // intからlongへのキャスト int ival; int lval = (long)ival; ご存知のとおり、キャストは非常に危険です。 本来ならば型の不一致によるコンパイルエラーをねじ伏せるのですから。 キャストの使われ方(意味)は、大きく3種(型変換/型変更/const外し)に分類されます。 型変換 // int から double へ int ival; double dval = (double)ival; 型変更 // long から int* へ long lval; int* iptr = (int*)lval; const外し // const int* から int* へ const int* ciptr; int* iptr = (int*)cip
オブジェクト指向とはなにか 日常生活の中のオブジェクト 私たちの身の回りには、自分で直接できることと自分では直接できないこととがあります。朝おきて何気なく読む新聞も、新聞社という組織が作り、近くの販売所が毎日届けてくれます。私たちが新聞を読むときには、誰がどのようにして作っているかを知る必要はありません。 また、あなたがエレベータに乗るときも、あなたは自分のいる階でボタンを押せばいずれエレベータがやってくると期待しているのです。それは、世の中にあるエレベータという乗り物がおおむねその様な動きをしていることを知っているからです。 駅まで行き、電車に乗る場合でも同じです。電車は、どこかの鉄道会社が作ったダイヤに従って動いているのです。あなたが、どの電車はこのように動きなさい、と規定するわけではありません。 通りでタクシーを拾う場合もそうです。あるタクシーは客待ちをしており、また、あるタクシーは
STL samples :function :struct :class <algorithm> 適用 for_each 検索 find find_if find_end find_first_of adjacent_find search search_n mismatch lower_bound upper_bound equal_range binary_search 係数 count count_if 比較 equal lexicographical_compare 複写 copy copy_backward 交換 swap swap_ranges iter_swap 変換 transform 置換 replace replace_if replace_copy replace_copy_if 充填 fill fill_n generategenerate_n 削除 remove
デバッグするとバグが出る?! : DLLにまつわる問題 ※ このアーティクルはWindows/NT環境下でMicrosoft Visual C++ 6.0 SP3 による開発の最中に出くわした’厄介’なバグとその顛末です。 debug-modeに切り換えたとたんバグが消えてしまうという症状に悩まされるのはよくあることですが、逆にdebug-modeでしか発生しないバグという何とも奇妙な… 何が起こったのか ここに掲載するアーティクルのため、小さなお試しコードを書いていました。XMLのチュートリアルXMLを用いた状態遷移で、IBM alphaWorksの XML4C(XML Parser for C++)を使ってXMLファイルをパースする試みの最中でした。 「こんなのどーってことないや」とタカをくくって鼻歌混じりにコードをこさえ、コンパイルも実行もいたって正常に完了しました。 僕は普段はもっ
ソフトウェア開発のプロフェッショナル集団 スケーラビリティ、セキュリティ、耐障害性、ネットワーク越しのサービス連携など、ソフトウェアの複雑性は増すばかりです。そのような中、安易な人海戦術や、上流・下流といった現実離れした分業で、優れたソフトウェアを作ることができるでしょうか? 株式会社エス・スリー・フォーは、一人一人のスキルを重視したソフトウェア開発のプロフェッショナル集団です。私達は、あくなき探究心とともに最新技術を追い求め、豊富な経験を通じて磨いたノウハウと結合し、お客様がかかえる様々な問題を IT技術によって解決いたします。
CppUnit 導入ガイド ダウンロードとインストール CppUnitは http://sourceforoge/projects/cppunit/ からダウンロードできます。2002.11時点での最新版は1.8.0(βは1.9.10)です。 zipもしくはtar+gzipで圧縮されているので、適当なディレクトリに展開してください。 以下の説明はWindows/Visual C++ v6.0 環境で、CppUnitのルート・ディレクトリを<CPPUNIT>と表記します。 ライブラリのビルド CppUnitはツール/ユーティリティの類ではありません。テスト対象およびテストコードと一緒にリンクして実行モジュールを生成する’ライブラリ’です。 CppUnitは様々なOS/処理系に対応しており、その使用に先だってライブラリをビルドしなければなりません。 Visual Studio IDE から プ
次のページ
このページを最初にブックマークしてみませんか?
『株式会社エス・スリー・フォー』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く