[リストへもどる]
一括表示
タイトルTJSのVC++でのコンパイルについて
記事No57
投稿日: 2005/07/08(Fri) 20:55
投稿者きらら   <ac17805w@st.nagaoka-ct.ac.jp>
参照先http://ilaliart.sourceforge.jp
こんばんは、井元さん。
はじめまして、きららと言います。

吉里吉里2/KAG3ムービー拡張日誌をいつも楽しく読ませて頂いています。大変ためになることが沢山書いてあるため、よくプログラミングの参考にさせていただいています。

さて、今回VC++でのソフト開発のための組み込み用言語として、VC++で吉里吉里のTJSスクリプトエンジンのコンパイルを試みたのですが、以下のようなエラーが修復できず正規表現部分にエラーを抱えたままの動作になっています。そこで、もしこのエラーについてご存知でしたら解決方法についてお教え願えませんでしょうか?

エラーがあったのはkr2_224_src.tar.gzのtjsRegExp.cppの120行目付近

unsigned int match_count = regex_grep
(
std::bind1st(std::mem_fun(&tTJSReplacePredicator::Callback),this),
target.c_str (),
_this->RegEx,
match_default|match_not_dot_null);

の式で、エラーの内容は

std::mem_fun : 2のオーバーロードは1番目の引数を'bool (__cdecl TJS::tTJSReplacePredicator::*)const boost::match_results<BidiIterator>)'から要求の型に変換できません。
with
[
BidiIterator_const wchar_t*
]

というものです。とりあえず、自分の力で解決できなかったので、ここの部分はコメントアウトして使っています。
実際に動作しているバイナリは

http://ilaliart.sourceforge.jp/arc/tjstest.zip

で配布しています。ソースコードは

http://ilaliart.sourceforge.jp/arc/tjstest_src.zip

で配布しています。

よろしくお願いします。

タイトルRe: TJSのVC++でのコンパイルについて
記事No58
投稿日: 2005/07/09(Sat) 20:06
投稿者管理人
参照先http://www.kaede-software.com/
きららさん、はじめまして、こんばんは。

ブログを読んでいただいてありがとうございます。

まずお聞きしたいのですが、Visual Studioのバージョン、Boostのバージョン、STLPortのバージョン(使っていれば)はなんでしょうか?

TJSのVC++でのビルドはまだやっていません。
そこで、試してみようと思い1から始めたのですが、大変そうなのでリンクしていただいているソースを使いました。
いろいろと追ってみたところ、std::mem_funのエラーは、メンバ関数のCallbackの呼び出し規約『TJS_cdecl』が問題のようです。
つまり、
bool TJS_cdecl Callback(const match_results<const tjs_char *> what)

bool Callback(const match_results<const tjs_char *> what)
と書き換えれば、このstd::mem_funのエラーはなくなるのですが、今度は次のようなstd::bind1stのエラーが出るようになりました。

functional(278): error C2535: 'std::binder1st<_Fn2>::result_type std::binder1st<_Fn2>::operator ()(const std::binder1st<_Fn2>::argument_type &) const' : メンバ関数は、既に定義または宣言されています。
with
[
_Fn2=std::mem_fun1_t<bool,TJS::tTJSReplacePredicator,const boost::match_results<const wchar_t *>>
]
functional(272) : 'std::binder1st<_Fn2>::operator`()'' の宣言を確認してください。
with
[
_Fn2=std::mem_fun1_t<bool,TJS::tTJSReplacePredicator,const boost::match_results<const wchar_t *>>
]
tjsRegExp.cpp(118) : コンパイルされたクラスのテンプレートのインスタンス化 'std::binder1st<_Fn2>' の参照を確認してください
with
[
_Fn2=std::mem_fun1_t<bool,TJS::tTJSReplacePredicator,const boost::match_results<const wchar_t *>>
]

boostと標準のSTLが競合しているような感じなのですが、まだ詳しくは見ていません。
また、見てみたいと思います。

ちなみに当方の環境は、Visual Studio.NET 2003, Boost 1.32, STLPort未使用です。

それでは。

タイトル解決しました。
記事No59
投稿日: 2005/07/10(Sun) 04:25
投稿者きらら   <ac17805w@st.nagaoka-ct.ac.jp>
参照先http://ilaliart.sourceforge.jp
井元さん。

こんばんは、きららです。

> > まずお聞きしたいのですが、Visual Studioのバージョン、Boostのバージョン、STLPortのバージョン(使っていれば)はなんでしょうか?

Visual Studio -> .Net 2003
Boost -> 1.32
STLPort -> 未使用

です。特にboostに関しては、BOOST_REGEX_NO_LIBを定義して~/boost<ver>/libs/regex/src/の内容をプロジェクトに追加してソースコードを直接コンパイルするようにしていました(これはboostが何か悪さをしているのではないかと色々やってみた結果だったのですが、あまり意味はありませんでした)。

まずはソースコードのおさらいからしてみます。
tjsRegExp.cppのtTJSReplacePredicatorクラスのコンストラクタ中で同クラス中のCallbackメソッドを関数オブジェクトとして利用しようとしています。
また、同じソースコードのtTJSSplitPredicatorクラスも同様のことをやろうとしています。

ここで、一つの問題が発生しました。mem_funが適用できません。
本来mem_funでメンバ関数アダプタを適用できるのはthiscall関数のみであるのに、TJS_cdeclマクロ(その実体は__cdecl)でC 関数の呼び出し規約をCallbackメソッドに適用しようとしています。なぜだかわからりませんが(bccではこれは仕様なのでしょうか?)。
これを外すことでmem_funは適用できるようになりました。

次に直面したのは、bind1stが重複しているという問題です。
tjsRegExp.cppではstd::bind1stが使用されています。これを用いると、Microsoftのfunctionalヘッダファイルで定義が重複するとコンパイラに怒られました。

これは井元さんが仰った通りです。

ここから先は、自分でなんとか解決を図ってみました。
さて、では何と重複しているのだろうと思い、GrepでVisualC++のインクルードディレクトリにbind1stで検索をかけてみました。ここで、注目に値する二つの検索結果が得られました。

1つは、boost/functional.hpp中、boost名前空間中のbind1st
2つ目は、Microsoftのfunctionalヘッダファイル中、std名前空間中のbind1st

この二つが存在しているのです。しかも、boost/functional.hpp中ではMicrosoftのfunctionalヘッダを読み込んでいます。これから何がわかるかというと、boostを利用する際は、関数オブジェクトへの値のバインドは、boost::bind1stを使えということらしいのです。boost::bind1stに使える関数ポインタアダプタはboost::mem_refということもこのヘッダからわかりました。

で、結局最終的には次のようにソースコードを書き直すことで解決しました。

unsigned int match_count = regex_grep (
boost::bind1st(boost::mem_fun(&tTJSReplacePredicator::Callback),this),
target.c_str (),
_this->RegEx,
match_default|match_not_dot_null) ;

最終的な結論としては、boostを使う場合は、using namespace std;は同時に利用しないほうが良いようです。boostではboostのアダプタ、バインダを利用するのが正しい使い方のようですね。

ソースコードを以下のURLにおいておきます。まだ正規表現がきちっと動くかどうかはチェックしていませんが、時間ができ次第やるつもりです。

http://ilaliart.sourceforge.jp/arc/tjstest2.zip


また、井元さんが日記で仰っていたTJS_Wマクロの問題ですが、VC++ではL##Xを用いることができる文字列は、単体だけのようです。従って次のようなコードはエラーになります。

L("Test" "Test") <- エラー
L("Test") L("Test") <- 正しい

お騒がせして申し訳ないです。大変役に立つ御助言ありがとうございました。今後とも、よろしくお願いします。

それでは。

タイトルRe: 解決しました。
記事No60
投稿日: 2005/07/10(Sun) 16:55
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/
おお、面白そうですね。

VC++6.0しか持ってないので分からなかったのですが、
最近のVC++ではコンパイルができるようになったのですね。
(VC++6.0は壊滅的にダメ)

もしよろしければ、VC++でコンパイルできるようにした際の
変更点を本家の方に取り込ませて頂きたいのですが、いかがでしょうか。

# もうそろそろいい加減 VC++6.0捨てるかなぁ

タイトルRe^2: 解決しました。
記事No61
投稿日: 2005/07/10(Sun) 18:19
投稿者きらら   <ac17805w@st.nagaoka-ct.ac.jp>
参照先http://ilaliart.sourceforge.jp
W.Deeさん、こんにちは、はじめましてきららといいます。

本家の方に取り入れて頂けるのであれば大変有難いです。
大変多くの部分の変更が必要だったため、今は大雑把な部分しかお伝えできませんが、近いうちに細かな変更点をまとめたいと思います。
主な変更点は

http://ilaliart.sourceforge.jp/arc/tjstest2.zip

中ではVC++コンパイラ固有の_MSC_VERでメインのソースから分離しているので(一部はそのまま修正してしまっているかもしれませんが)元のソースに影響は与えていないと思います。

記憶に残っている部分だけ挙げますと、

・TJS_Wマクロで複数の文字列の展開を行っている部分
TJS_W("a" "b")はTJS_W("a") TJS_W("b")と分離する。
・tjsConfig.hでのCランタイム関数の定義の修正(drand->rand)など。
・Boland固有の関数部分の排除(TJSSetFPUE関数内)
・tjsMath.hのソースの先頭でのM_PIなどの定義の追加
・tjs.cpp内でのTJSCompiledDateの定義(__DATE__)などの定義がなかったため、適当な文字列を代わりに入れてその場しのぎをしています)。
・tjsRegExp.cpp内でのbind1st、mem_funのstd->boost名前空間の変更
(前回の発言の中でそれについては触れています)

です。修正後のソースのコンパイルテストなど必要でしたら言って下さい。喜んで協力させて頂きます。

それでは。

タイトルソース使っても良いですか?
記事No63
投稿日: 2005/07/10(Sun) 18:55
投稿者管理人
参照先http://www.kaede-software.com/
きららさん、こんにちは。

公開されているソースコードですが、使わせさせていただいてもいいですか?
ライセンスは、GPL or 吉里吉里独自ライセンスの流用項という認識で良いのでしょうか?

では、よろしくお願いします。

タイトルソースの流用について
記事No64
投稿日: 2005/07/10(Sun) 19:14
投稿者きらら   <ac17805w@st.nagaoka-ct.ac.jp>
参照先http://ilaliart.sourceforge.jp
井元さん、こんばんは。

http://kikyou.info/extractor/?arc=tvp%2Ffiles%2Fkr2_224.lzh&file=license.txt&ct=text%2Fplain%3B%20charset%3DShift_JIS

ソースの流用についてですが、吉里吉里のライセンス書では、GPLもしくは吉里吉里独自ライセンスのどちらかに準拠すれば良いと書かれているので、自分はGPLを採用します。
そういえば、アーカイブ中にGPL許諾書入れてなかったですね。すいません、入れておきました。

それと、吉里吉里の独自ライセンスに関してですが、流用改造の項で、流用の場合も改造の場合も、このソフトウェアに含まれるソース、あるいはバイナリを使用している旨をドキュメント等に表記することと書かれていますが、これはソースコード内に著作権表記を残したままで配布することで条件が満たされるのでしょうか?


それでは、こちらこそよろしくお願いします。

タイトルRe: ソースの流用について
記事No65
投稿日: 2005/07/11(Mon) 17:47
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/

> それと、吉里吉里の独自ライセンスに関してですが、流用改造の項で、流用の場合も改造の場合も、このソフトウェアに含まれるソース、あるいはバイナリを使用している旨をドキュメント等に表記することと書かれていますが、これはソースコード内に著作権表記を残したままで配布することで条件が満たされるのでしょうか?

ソース配布であればそれで可能ですが、バイナリのみの配布でソースが無い場合は別途ドキュメントに記述していただく必要があります。

あと、「あるいは、」「のソフトウェアの作者に配布を行う旨を事前に連絡し確認をとること」とライセンスには書いてあるはずですが、これはもう連絡し確認なさったと解釈してくださって結構です (^^; (こうやって知ってますし)

ご協力までいただけると言うことで大変ありがたく思っております。
では、よろしくお願い致します。

タイトルRe^3: 解決しました。
記事No66
投稿日: 2005/07/11(Mon) 20:01
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/
きらら様

たびたび失礼致します。W.Deeです。

ソースを見させて頂きましたが、
TJS_eTJSErrorがしばしば
TJS::TJS_eTJSErrorに置き換わっているのは名前の解決でなにか
問題があったのでしょうか。
私はVC++の該当バージョンを持っていないのでテストはできませんが、
ざっと見た感じ、TJS:: を付けなくても TJS_eTJSError で問題なさそうな
感じを受けます。

よろしくお願い致します。

タイトルTJS_eTJSErrorの問題について
記事No67
投稿日: 2005/07/11(Mon) 23:06
投稿者きらら   <ac17805w@st.nagaoka-ct.ac.jp>
参照先http://ilaliart.sourceforge.jp
W.Dee様。

こんばんは、きららです。

> > ソースを見させて頂きましたが、
> TJS_eTJSErrorがしばしば
> TJS::TJS_eTJSErrorに置き換わっているのは名前の解決でなにか
> 問題があったのでしょうか。
> 私はVC++の該当バージョンを持っていないのでテストはできませんが、
> ざっと見た感じ、TJS:: を付けなくても TJS_eTJSError で問題なさそうな
> 感じを受けます。

確か、一部のメソッドが名前空間に問題があってエラーが出たと記憶しています。それがTJS_eTJSErrorだったかどうかは覚えていませんが、多分そのように変更されているようでしたら、問題があったのだと思います。

現在、もう一度同じアーカイブを落としてきて、厳密な変更部分の洗い出しを行っています。初期時のエラーと警告の箇所は次のファイルにして上げました。

http://ilaliart.sourceforge.jp/arc/tjs_er_warn_first.zip

トレースには時間がかかりそうです。お待たせしてしまうかもしれませんが、その点ご了承ください。

それでは。

タイトル問題点をまとめたテキスト
記事No68
投稿日: 2005/07/12(Tue) 00:56
投稿者きらら   <ac17805w@st.nagaoka-ct.ac.jp>
参照先http://ilaliart.sourceforge.jp
こんばんは、きららです。

コンパイル時の変更点をまとめたテキストを下記URLに上げておきました。

http://ilaliart.sourceforge.jp/arc/tjs224_change_log.zip

やはり、先ほどのTJS名前空間の定義は必要なようです。
それでは。

タイトルRe: 問題点をまとめたテキスト
記事No69
投稿日: 2005/07/12(Tue) 12:32
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/
こんにちは。W.Deeです。

・operator new 内で例外をスローすると、new演算子を使用している場合にメモリを開放しないらしい。

あらら、これは知らなかったです。
メモリは解放されるもの、と仮定してプログラミングをしていたのでTJS2も問題がどこかにあるかもしれません (ちょっと思い出そうにも思い出せませんが)。
new 演算子のオーバーロードでなんとかなるかな ...

・TJS_eTJSError、TJSAllocVariantStringになぜ名前空間TJSを明示してやらなければならなかったのかが謎。

これは変ですね。納得がいきません。

TJS_eTJSErrorはTJS::をつけないとエラーになるのにTJS_eTJSVariantErrorはつけなくて大丈夫、とか。


警告一覧やエラー一覧をざっと見ましたが よくよく見ればポインタの差を int につっこんでいたり size_t を int につっこんでいたりが指摘されていますね。なかなか興味深いので、もうしばらくたったら、やはりこちらでもVisual C++ Toolkitを導入するか、VC++ を購入してテストしてみたいと思います。


tjs2をVC++でコンパイルできるようにするためのブランチを以下に作成しました。

https://sv.kikyou.info/svn/kirikiri2/branches/tjs2-msvc-adapt

https://sv.kikyou.info/svn/kirikiri2/branches/tjs2-msvc-adapt/tjs2 には、現時点では trunk からの tjs2 が入っています (2.24 のものではありません)。

吉里吉里関連の開発には、バージョン管理システムとして Subversion を使用しておりますが、もしよろしければ、きらら様のここのリポジトリに書き込みを行うためのアカウントもお作り致します。


それと、一応の確認ですが、きらら様の tjs2_comp_src (tjstest2.zip) は GNU GPL となっておりまが、本家にマージする場合は、吉里吉里のデュアルライセンスが適用できることが条件となっております (つまり、GNU GPL only なライセンスのものを混入できない)。本家にマージしてよろしいでしょうか?





よろしくお願い致します。


#ここの掲示板をこのようにお借りしていてよろしいのでしょうか(^^;

タイトル利用して頂いて大丈夫です
記事No70
投稿日: 2005/07/12(Tue) 13:24
投稿者管理人
参照先http://www.kaede-software.com/
W.Deeさん、こんにちは。

掲示板の利用は大丈夫です。
私もVCでTJSを使いたいですし、対応されたものが吉里吉里 & GNU GPLライセンスになるのを待ってます。(笑)
ならなかったら、自分でやろうと思って、読んでました。

それでは。

タイトルデュアルライセンスの適用について
記事No71
投稿日: 2005/07/12(Tue) 21:07
投稿者きらら   <ac17805w@st.nagaoka-ct.ac.jp>
参照先http://ilaliart.sourceforge.jp
W.Deeさん、井元さん、こんばんは。

> > ・operator new 内で例外をスローすると、new演算子を使用している場合にメモリを開放しないらしい。
> > あらら、これは知らなかったです。
> メモリは解放されるもの、と仮定してプログラミングをしていたのでTJS2も問題がどこかにあるかもしれません (ちょっと思い出そうにも思い出せませんが)。
> new 演算子のオーバーロードでなんとかなるかな ...

メモリリークについてはチェックしましたが、例外をスルーした場合以外は無かったです。確かに、この部分は修正が必要そうですね。

Subversionについては、今調べています。アカウントについては、用意ができ次第メールにてお願いしたいと思います。

確かに、よくよく考えずにGPLだけ適用してしまいましたが、吉里吉里本体に組み込んでもらうためにはデュアルライセンスが必要ですね。

吉里吉里のライセンス文を熟読していなかったため、中途半端な状態での適用は失礼かと思い、GPLだけにしましたが、そういった事情があるのであれば是非デュアルライセンスを適用して頂ければと思います。それに伴い、自分のほうでもライセンス文をもう一度読み直させて頂きました。その際、ライセンス文をpdf化しました。

http://ilaliart.sourceforge.jp/pdf/Kirikiri_License.pdf

それでは。

タイトルRe: デュアルライセンスの適用について
記事No73
投稿日: 2005/07/12(Tue) 22:19
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/
Subversion についてです。

Subversionのようなバージョン管理ソフトは、
ソフトウェア開発に限らず、コンテンツの共同開発などでもかなり
有用だと思うのでそのうちドキュメントとしてまとめて公開したいと
おもっています。


クライアントは TortoiseSVN がお勧めです。これだけあれば、
SubversionのWindows用バイナリがなくても動作します。

http://tortoisesvn.tigris.org/

ここの download で 「Version 1.2.0.3602 for Win2k/XP (8.2 MB)」をダウンロードします。
VS.NETのバグ回避バージョンを使う必要があれば「uses _svn folders instead of .svn to
work around the VS.NET bug with web projects.」の方がいいかも知れません。

また、下の方にある Language Pack for 1.2.0 の日本語 (LanguagePack_1.2.0_ja.exe)
をダウンロードします。

TortoiseSVN をインストールして、Language Pack をダウンロードするとするとデスク
トップなどを右クリックした際に出てくるメニューに「TortoiseSVN」という項目が
出てきますので、このなかから「Settings」を選択し、General -> TortoiseSVN -> Language で
「日本語」を選択します。

適当な場所にフォルダを作成します。これが以降、「作業用コピー」と言われる物になります。
そのフォルダをエクスプローラなどで開いたあと、右クリックすると「SVN チェックアウト」
という項目があると思います。そこで

https://sv.kikyou.info/svn/kirikiri2/branches/tjs2-msvc-adapt

を入力し、OK ボタンをおすと、リポジトリ(サーバ上のソース置き場)
からソースのダウンロードが始まります。

これで作業の準備が整いました。

ソースを変更するとアイコンが変わるので、どのファイルが変わったのかを知ることができます。
また、「SVN ログを表示」でそのファイルやディレクトリに対するログ、「SVN 差分」で
自分のコミット前の変更点を知ることができます。
新規にファイルを追加する際は ファイルを選択し、右クリックから「追加」を選択します。

コミットする際の注意点ですが、
・コミットする前に必ず「SVN 更新」を行い、他の人が更新をしていないかをチェックしてください
・ビルドに不必要な物はコミットしないでください。一度ファイルをコミットしてしまうと消すのが大変です

詳しくはTortoiseSVNのマニュアルなどを参照してください。
簡単な説明がここにもあります。

http://tortoisesvn.bluegate.org/Help/dailyuseguide.html

タイトルIRCにお越しください
記事No74
投稿日: 2005/07/13(Wed) 17:43
投稿者W.Dee   <dee@kikyou.info>
参照先http://kikyou.info/
すみません、

> > > > ・operator new 内で例外をスローすると、new演算子を使用している場合にメモリを開放しないらしい。
> > > あらら、これは知らなかったです。
> > メモリは解放されるもの、と仮定してプログラミングをしていたのでTJS2も問題がどこかにあるかもしれません (ちょっと思い出そうにも思い出せませんが)。

これについてと、あと今後の開発についてもう少し詳しくお話を聞
きたい/したいのですが、掲示板でのコミュニケーションだと
時間がかかりすぎるので、お手数で恐縮ですが IRC チャンネル
#kirikiriirc にお越しいただけないでしょうか。

IRC接続先のサーバはワールドワイドに接続されているサーバならば
どのサーバでも結構です (国内ならば
http://irc.kyoto-u.ac.jp/list-of-servers.html )。

私は 21時〜24時には確実に居ます。

よろしくお願い致します。

タイトルIRC招待についてと、Subversionについて
記事No75
投稿日: 2005/07/15(Fri) 09:08
投稿者きらら   <ac17805w@st.nagaoka-ct.ac.jp>
参照先http://ilaliart.sourceforge.jp
W.Deeさん。

おはようございます、きららです。

IRCについては先日お邪魔しましたが、時間の都合で会うことができませんでした。近いうちにまたお邪魔させていただきたいと思います。

また、Subversionについて大変丁寧なご説明を頂き、ありがとうございました。導入が完了しましたので、順次ソースをアップしてゆきたいと思います。

それでは。