タグ「c言語」が付けられているエントリー

WindowsなC言語でXMLをパースする試み

| | コメント(0) | トラックバック(0) WindowsなC言語でXMLをパースする試み

調べたけど分からない.決定的なものが見当たらない.MSXMLを使うのが簡単そう.だけど,自宅では環境が足りない模様.明日,開発環境でテストしてみるコード.ちなみに,「実証コードには手間を掛けない」が持論なので,簡単にXMLをパースしちゃう言語をご紹介.「これはひどい」で有名なPHPで.

<?php
$string = <<<XML
<a>
<b>
<c>text</c>
<c>stuff</c>
</b>
<d>
<c>code</c>
</d>
</a>
XML;

$xml = new SimpleXMLElement($string);

/* <a><b><c> を探します */
$result = $xml->xpath('/a/b/c');

while(list( , $node) = each($result)) {
echo '/a/b/c: ',$node,"\n";
}

/* 相対パスでも動作します... */
$result = $xml->xpath('b/c');

while(list( , $node) = each($result)) {
echo 'b/c: ',$node,"\n";
}
?>

PHP: SimpleXMLElement::xpath - Manual

実行結果は以下の通り.

/a/b/c: text
/a/b/c: stuff
b/c: text
b/c: stuff

PHP: SimpleXMLElement::xpath - Manual

xpathもできて,かんたーん.

諸事情で,QRコードを複数認識したい衝動に駆られた.で.libdecoreqrってのが便利らしいので,試してみた.現時点までで分かったこと.

  • OpenCVが予想以上に便利だった
  • libdecodeqrで複数QRコードを認識させるには,外側からのアプローチじゃダメそうなので,中身を弄らないとダメそうなことは理解した
  • QRコードの方がイメージしやすいと思ったんだけど,
  • あきらめてARToolKitで複数マーカ認識にした方が良いだろうか
  • 実はARToolKitはあまり得意じゃないです><;
  • ニコニコ技術部のソースファイル(もしくは考え方)がみたい・・・
  • 具体的にはQRコード上のミク

おなかすいた.

理系トップクラスの大学院生でこの体たらくとは.CS系の学生には常識中の常識だと思うが,浮動小数点は信用ならないから,正確な演算結果が欲しいなら固定小数点でやる.以下,実証コードをC言語で.コンパイラはBCC32 5.5.1です.

#include <stdio.h>
union test {
double a;
int b[2];
} test;
void main() {
union test a;

a.a = 0.1;
printf("%lf=%x %x\n", a.a, a.b[1], a.b[0]);

a.a = 1.0;
a.a -= 0.9;
printf("%lf=%x %x\n", a.a, a.b[1], a.b[0]);

a.a = 0.09;
a.a += 0.01;
printf("%lf=%x %x\n", a.a, a.b[1], a.b[0]);
}

実行結果はこんな感じ.

C:\Temp>test
0.100000=3fb99999 9999999a
0.100000=3fb99999 99999998
0.100000=3fb99999 99999999

JK.0.1っていう数字を正確に表現できる君は,コンピュータよりも圧倒的に優れているよ.間違いなく.

関連:
Windows の更新の電卓のアクセサリ
グーグルの電卓機能が計算ミス:ニュース - CNET Japan

せっかくだからまとめ.こっちの環境は,Windows XP Pro SP3にVisual Studio 2008 Proです.

ARToolKit on Visual Studio 2008
なんというか,工学ナビ様の通りにやればいいと思うよ.このガイド通りで,トラブルフリーです.最高♪

PTAM on Visual Studio 2008 w/ Web-Camera
こっちはちょっと手こずる.手こずるっていっても,時間がかかるっていうだけで,以下の手順に従えば,できます.今回は現時点での最新ソース(v1.0-r111, Mon, 11 May 2009 16:38:02 +0100)を利用しています.基本的なガイドは以下の通り.

マーカレスAR(PTAM)のソースコードを動かしてみた(WindowsXP VisualC++) | happymeme

今回は最新ソースのREADME.txtに従って,TooN,libcvd,gvars3をCVSからとってくる.ガイド通りだと,build\vc2005となっているが,最新ソースのREADME.txtで示されているリビジョンをダウンロードすると,build\vc2008がありますので,それを使います・・・と見せかけて,slnが変になってるのか,読み込めないので,結局build\vc2005を使うのでした.どんまい!てか,gvars3だけ上手くコンパイルできない.config.hがない件については,config.h.inをリネームします.もう1つのエラーは,以下の通り.

以前のバージョンのソースを参考に、次の行を、

template static T& get(const std::string& name, const T& default_val=DefaultValue::val(), int flags=0);

次のように書き換える。

template static T& get(const std::string& name, const T& default_val=T(), int flags=0);

とりあえず、良しとする。

自己満足なBLOG

えーと.上手くいきません.上手くいかないので,gvars3.hの261行目を以下のように書き換える.

template<class T> static T& get(const std::string& name,
const T& default_val=T(), int flags=0);

実際には改行しないで下さい.準備が整ったら,PTAMをWebカメラで使えるようにいじります.もちろん,工学ナビ様の思し召しのままに.手順としては簡単に述べると以下の通り.VideoSource.hとVideoSource_Win32_EWCLIB.ccをPTAMのルートに.PTAM\Build\Win32にあるVideoSource_Win32_CMU1394.cc以外の3ファイルをPTAM直下にコピー.CameraCalibrator.vcorojの208行目とPTAM.vcprojの368行目を以下の通り書き換える.

書き換え前:RelativePath=".\VideoSource_Win32_CMU1394.cc"
書き換え後:RelativePath=".\VideoSource_Win32_EWCLIB.cc"

後は神に祈るのみ.あ.dxtrans.hの件を忘れていた.

そうですね。
ここにjiapeiさんが書かれている方法を元に編集したら若干警告はあるもののビルドできました。
SampleGrabber も使えました。
私の環境における編集内容は下記です。
//#include "dxtrans.h" ・・・ 495行目
IDxtCompositor //: public IDXEffect ・・・ 979行目
IDxtAlphaSetter //: public IDXEffect  ・・・1484行目
IDxtJpeg //: public IDXEffect ・・・1725行目
IDxtKey //: public IDXEffect ・・・2400行目

オラ検: DirectShowと戦うスレ Part 2 (990) via DirectX SDK November 2007にdxtrans.hが入っていない件について - DenpaFreak

これでコンパイルはできたが,Webカメラがないので,続きは月曜日以降に・・・.

関連:
SourceForge.net: ARToolKit
Parallel Tracking and Mapping for Small AR Workspaces (PTAM)
工学ナビの中の人の研究と周辺 ゼロからはじめるARToolKit on VisualC++ 2008 Express Edition
マーカレスAR(PTAM)のソースコードを動かしてみた(WindowsXP VisualC++) | happymeme
自己満足なBLOG
工学ナビ - BACKYARD
DirectX SDK November 2007にdxtrans.hが入っていない件について - DenpaFreak
オラ検: DirectShowと戦うスレ Part 2 (990)
マーカーレスAR技術「PTAM」をDVカメラで動作させてみる - program - 釣堀.net
PTAMをがんばってみる - 4403 is written

Linuxでやれば簡単なのに!(挨拶)

Visual Studio 2008でGMPを使う方法を書いておく.備忘録.環境はWindows XP Pro SP3に,Visual Studio 2008 Proです.基本方針はこれを参考にしてます.手順内に出てくるリンク切れの参考サイトはこっち

  1. なにはなくとも,GMP本体をダウンロードする.2009年4月28日時点では4.3.0が最新のようだが,ビルドに必要なファイルが4.2.4を前提にしているらしいので,4.2.4をダウンロード(直リン注意!)する.なお,4.3.0に4.2.4用のビルドファイルを適用してみたが,ダメだった.どこをどう直せばいいのか,皆目見当もつかないくらいにエラーが出たので,今後の課題に.
  2. ダウンロードしたgmp-4.2.4.tar.gzを展開する.ここでは,c:\gmpとする.
  3. このサイトで提供しているgmp-4.2.4.vc9.zipをダウンロードして,解凍する.解凍したファイルをc:\gmpに上書きする.
  4. C:\gmp\build.vc9\yasm.rulesをC:\Program Files\Microsoft Visual Studio 9\VC\VCProjectDefaultsにコピーする.
  5. YASMから,適切なバイナリ(例えば,yasm-0.8.0-win32.exe)をダウンロードし,yasm.exeにリネームして,C:\Program Files\Microsoft Visual Studio 9\VC\binにコピーする.
  6. C:\gmp\build.vc9\gmp.slnを開くと,エラーが4回くらい出るので,無視します.これは,異なるプラットフォームだからだそうですが,Core2でコンパイルしたいなぁ・・・.何故かエラーになる.どうやるんだろう?OSが64ビットじゃないから?
  7. gen-bases, gen-fac_ui, gen-fib, gen-psqrの4つをビルドしまくる.
  8. dll_gmp_p4とlib_gmp_p4をビルドる.
  9. lib_gmpxxをビルドる.
  10. c:\gmp\build.vc9\dll\Win32\(Debug|Release)\にdllファイルが,c:\gmp\build.vc9\lib\Win32\(Debug|Release)\にlibファイルができます.
  11. c:\gmpにあるヘッダファイルをC:\Program Files\Microsoft Visual Studio 9\VC\includeに,ビルドされたlibファイルをC:\Program Files\Microsoft Visual Studio 9\VC\libにコピー.

これでok.続いて,GMPを用いたコードをテストします.以下のコードをコンパイルすることを考えましょう.

#include<iostream>
#include<gmpxx.h>
using namespace std;

mpz_class factorial(int val){
    mpz_class result = 1;
    for(int i=1; i<=val; i++) result *= i;
    return result;
}

int main(void){
    mpz_class result = factorial(300);
    cout << result.get_str() << endl;
    return 0;
}

Windows 環境下での GMP の利用法

結果は,こんな感じ.

090428_gmp01.png

あーさむ.ただし,何故かコンパイル時にエラーが出ることがある.その場合は,静的リンクを設定してみて下さい.

関連:
Windows 環境下での GMP の利用法
A Native GMP Port Using Microsoft Visual Studio

1年総決算エントリを書き始める時期になりました.今年はいろんな言語を扱いました.

  • C
  • Java
  • JavaScript
  • LaTeX
  • NQC
  • Perl
  • PHP
  • Prolog
  • XHTML + CSS

この中で苦もなく書けるのは,やはりC言語.難しいことをしなければ,リファレンスを読まなくても書けます(ぇ,それ普通?).入門してすぐに挫折したのは,Objective-C.オブジェクト指向が苦手なオレとしては,ありゃダメだ.今年はVBを書かなかったけど,年明けになると書かざるを得ない状況になるのかなぁ・・・.予め想定で書いておけばいいのかな?実家にはVB環境がないな(ぁ.

それから,(X)HTMLやらCSSやらは,相変わらずvalidな記述を心がけてます.W3Cの甘さに喜び,Another HTML-Lintの厳しさに半ベソです.マイブームはXHTML 1.0 Strictです.「まだ1.1じゃないのか」というツッコミは躱します.そうこうしている間に,XHTML 2.0やらHTML 5.0が出てくるでしょう(いつの話だ).

それから忘れてはならない言語は英語と日本語.相変わらず英語のスキルは向上していない.言ってることはだいたい理解できるのだが,喋ろうと思っても言葉が出てこないのはどうにかならないのだろうか.シナプスが一方通行になっているのだろうか?なお,日本語のスキルは社会人仕様になっているはずなので,少しは向上していると信じたい.

初音ミクが歩いているらしいので,羨ましく思います.というか,こういうネタこそナイトセッション向けですよね.というわけで,来年に向けて準備してみる.いや,直近では研究室説明会か?コンパイルガイドは以下のページを参考にしまくり.

マーカレスAR(PTAM)のソースコードを動かしてみた(WindowsXP VisualC++) | happymeme

コンパイル環境はWindowsXP Pro SP3にVisual Studio 2005 Proです.DirectX SDKは・・・なんだかMicrosoft SDKs v6.1って書いてあります.よくわからない.

以下,躓いた点.

CVSが繋がらない
お約束です.cvsもsvnも繋がらないとは!過剰なFWですねっ!CiNiiも繋がらないし,不便だわん!仕方がないので,sshで外部サーバに接続してゲットしてきました.なんだかなぁ・・・.

dxtrans.hがない
お約束っぽいです.

どうも怪しいと思ってたんだ。DirectX SDK November 2007にはdxtrans.hが入っていません。

ので、qedit.hをインクルードしているファイルをデバッグ(コンパイル)するとエラーが出ます。

DirectX SDK November 2007にdxtrans.hが入っていない件について - DenpaFreak

対策通りに修正します.バージョンが違うので修正箇所も違うようです.オレの環境ではそれぞれ,498,837,1151,1345,1735行目でした.トラブったら情報はどんどん公開しよう!

IEEE1394カメラからWebカメラへの変更
工学ナビの中の人のソースを利用.

3. PTAMにもともと同梱されている VideoSource_Win32_CMU1394.cc の代わりに
   このフォルダに同梱されている VideoSource_Win32_EWCLIB.cc を使う.

同梱のreadme.txtより

さらっと書かれていて,見事にわからなかった.その後のリビルドでエラーをみて理解した.CMU1394の変更はCameraCalibrator.vcprojの208行目を書き換えることで解決.

関連:
Parallel Tracking and Mapping for Small AR Workspaces
YouTube - Parallel Tracking and Mapping for Small AR Worspaces - extra
『攻殻機動隊』『電脳メガネ』どころではない拡張現実感技術の現在 | 王様の箱庭
Cagylogic: PTAM

ハッキリ言って,Touchlib公式の説明は分からない.CMUPlatformSDKDirectX SDKも説明が一切無い.DirectX SDKはJPEG2000関連でインストールしておいたし,PlatformSDKは経験上気が付いたから良いものの,CMUはビルド時のエラーで環境変数がないというところから,逆引きして判明したくらい.どこにも書いていない!分かるわけがない!

というわけで,四苦八苦して動かせたのは,同じトラブルにはまった人が,ブログ上で情報を公開してくれていたから.ブログはこういうためにあるんだと思う.思ったこと,やったことを思いつくままに書いておけばいいんだと思う.必要なものは必要とされるし,不要なら淘汰される.適当に書いておいても,グーグル先生が適当に整理してくれる.それがウェブを媒介とした新しい情報配信と共有だ.単純なプッシュしかできない旧来のメディアには出来ない芸当であろう.以下,手順を転載.本当にありがとう.

Miscallenous Libraries
OpenCV (download OpenCV_1.0.exe)
DSVideoLib (download dsvideolib-0.0.8c)
VideoWrapper (download VideoWrapper_0_1_1.zip)
GLUT (download glut-3.7.6-bin.zip)
OSCpack (download oscpack_1_0_2.zip)
CMU 1394 Digital Camera Driver (download 1394camera644.exe)
Windows Server 2003 R2 SDK (aka Platform SDK) Web Install, Full download or ISO
DirectX SDK (download August 2007)

Setting environment variables:
Depending on your setup you might need to change a few directory location values.

  1. Press the right mouse button on “My Computer” and choose: Properties > Advanced > Environmental Variables
  2. To add an entry, click “new” at the System Variables.
  3. Add the OpenCV root directory:
    name: “OPENCV_HOME”
    value: “C:\Program Files\OpenCV”
  4. Add the DSVideoLib:
    name: “DSVL_HOME”
    value: “C:\_libraries\dsvl-0.0.8c”
  5. Add the VideoWrapper
    name: “VIDEOWRAPPER_HOME”
    value: “C:\_libraries\VideoWrapper_0_1_1″
  6. Add the OSCpack
    name: “OSCPACK_HOME”
    value: “C:\_libraries\oscpack_1_0_2\oscpack”
  7. Add the CMU driver location
    name: “CMU_PATH”
    value: “C:\Program Files\CMU\1394Camera”

Visual studio settings:
We are almost done with setting up the enviroment, there are just a few steps left before we can compile Touchlib.

  1. Open up “solution.sln” in the “C:\multitouch\touchlib\build\VC8″ directory.
  2. Choose Tools > Options
  3. On the left choose Project and Solutions > VC++ Directories
  4. On the right change “Show directories for:” to “Include files”
  5. Add the directory “C:\_libraries\glut-3.7.6-bin”
  6. Add the directory “C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include”
  7. Add the directory “C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Samples\Multimedia\DirectShow\BaseClasses”
  8. Add the directory “C:\Program Files\Microsoft DirectX SDK (August 2007)\Include”
  9. Change “Show directories for:” to “Library files”
  10. Add the directory “C:\_libraries\glut-3.7.6-bin”
  11. Add the directory “C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib”
  12. Add the directory “C:\Program Files\Microsoft DirectX SDK (August 2007)\Lib\x86″
  13. Click OK
  14. In the menu choose Build > Build Touchlib
  15. When it has compiled Touchlib, Build > Build solution
  16. The End

Touchlib compiling instructions | Multigesture.net

本当に,トラブルはみんなで共有するべき.

単なる愚痴.朝から午後の早い時間まで,ずーっとVisual Studio 2005 Proと睨めっこしてた.今日,オレを苦しめたのはARToolKitTouchlib

ARToolKitは2年前にVC6で動かしているから,事もなく行くと思ったら,いかないでやがんの.OpenVRML関係が上手くビルドできない.メチャメチャ苦労した挙句に,結局諦めて,デモソフトのメタセコイヤのやつを動かそうと思ったら,こっちもビルドが通らない.おかしいなぁ・・・.これは普通にできたはずなんだが・・・.VC6とVS2005でこんなにも違うとはorz.一応,目標のところまでは動かせて,「これじゃダメだ」ってことが確認できたのでok.

続いて,Touchlibのビルドを行うも,こっちは散々な出来.サッパリダメだ.結局,何一つビルドできなかった.2時間も投資したのに><.デモソフトは動かせたが,キャリブレーションの仕方が分からない.何かの手順を間違えているんだと思うが,如何せんドキュメントが少なくて,何をどうして良いのやら・・・.smokeくらいはキャリブレーションなしの勘で動いて欲しい・・・.精度なんて求めないのに.それっぽく動いてくれるだけで良いのに・・・.

よくわからんのだが,どっちもVS2003.NETなら上手く動くらしい.でも,今更2003は入れたくないので,入れるならVC6だろう.VC6マンセー!ちなみに,VS2008はまだ使ったことがない.MSDN AAに無いんだけど・・・.要求すると出てくるのかな?

結論:
Macを買って,Objective-Cを使えばいいんだと思う.マジで.

Kakku Tipsのメモメモへコメント的なエントリーポスト.

#include <stdio.h>
#include <stdlib.h>
void main(void){
    printf("\a");
    system("cls");
}

enjoy!

関連:
エスケープシーケンス一覧
BohYoh.com【C言語講座】標準ライブラリ関数 system
Windowsコマンド集:(cls)

タグ

あわせて読みたい