• 締切済み

茶筌2.4.0 異常終了してしまう

茶筌2.4.0を使って形態素解析の応用アプリを作っています。 外部ファイルから、繰返し解析して用語の形態素解析を 行っているのですが、78回目のループで茶筌が異常終了して しまい、エラーメッセージも出さずに終了してしまいます。 手動で異常終了した用語を解析しても特に異常はありませんし、 外部ファイルを変えても同様です。 茶筌では一度に可能な解析回数の制限でもあるのでしょうか。 もし、制限があるようであれば、解除したいと思っています。 どなたか、ヒントだけでもご教授願えないでしょうか。 こちらの環境は Windows Xp home edition Borland C++ Builder6 pro 茶筌2.4.0 ~です。 宜しくお願いします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

#1の補足にあるコードは、実際に使っているメソッドか関数からそのまま 抜き出したものなのでしょうか? でもそれだと解析関数にファイルからの入力渡してないですよね。 それと、質問にエラーメッセージも出さずに終了するというのは 具体的にどういう状態なのでしょうか? 質問者さんが作っているアプリのウィンドウがいきなり消えるとかでしょうか。 もうひとつ、75回目までは期待している結果が返ってきてますか?

toshi_yn
質問者

補足

> それと、質問にエラーメッセージも出さずに終了するというのは > 具体的にどういう状態なのでしょうか? デバッグ表示でみますと、78回目の"libchasen.dll"のロードの後 アプリのウィンドウが強制終了されています。 77回目まではDLLのロードとアンロードが繰り返され、期待している結果も得られています。 やはり、その都度、DLLのロードとアンロードを何回も繰り返すのは好ましくないのかもしれません。 もう少し頑張ってみます。

回答No.1

http://chasen-legacy.sourceforge.jp/ から最新版の2.4.2を入手してみては? 「異常終了する」って事は「単に2.4.0がバグってる」とか「コンパイルオプションがソースコードに適合してなくて、意図しない動作をしている」だけなのかも知れませんよ。 あと、茶筌は、自分でソースをコンパイルして自分で実行ファイルを作成する筈なので、作成時に「プロジェクトをデバッグモードでコンパイル」して、トレースやステップ実行などのソースコードデバッグか可能だと思うので「どこで例外を吐いて落ちているか」を調べられるのでは? 良くあるのが「コンパイルオプションが合ってなくて、成立する筈の条件式が成立せず、プログラムが意図しない動きをしていて、例外で落ちる」と言うケース。 たいてい、こういうケースは「コンパイル時のワーニングを無視している場合」に起きるので「暗黙の型キャストで条件判定に失敗する可能精のある事を警告するワーニングなど」が出てないか、良く確かめましょう。

toshi_yn
質問者

お礼

早速のご回答ありがとうございます。 > 最新版の2.4.2を入手してみては? すみません。2.4.2でした。マニュアルに2.4.0と記載されていたもので・・・・。 > 「異常終了する」って事は「単に2.4.0がバグってる」とか > 「コンパイルオプションがソースコードに適合してなくて、 > 意図しない動作をしている」だけなのかも知れませんよ。 現在、下記のようなコードで行っているのですが、「argvが使われていない」、「set_argument_parametersが使われていない」という警告が出ています。何せ、コピペ・ど素人なものですから、chasenのパラメータ設定が良く分かりません。 set_argument_parametersについてヒントだけでもいただけると助かります。 宜しくお願いします。 --ここから-- typedef char* WINAPI (*TAnalyze)(char*); TAnalyze analyze; typedef int WINAPI (*TSetArgParm)(int argc,char** argv); TSetArgParm set_argument_parameters; char *argv[3] = {"chasen","-a", "-r"}; HINSTANCE cDLL; char *input;// = "解析したい文字列"; cDLL = LoadLibrary("libchasen.dll"); if (cDLL){ analyze = (TAnalyze)GetProcAddress(cDLL,"chasen_sparse_tostr"); set_argument_parameters = (TSetArgParm)GetProcAddress(cDLL,"set_argument_parameters"); AnsiString StrTest=analyze(input); } else ShowMessage("LoadDLL失敗"); FreeLibrary(cDLL); --ここまで--

関連するQ&A

専門家に質問してみよう