[mecab-devel 31] Re: libmecab.dllのエクスポート関数

Back to archive index

c-spe****@jcom***** c-spe****@jcom*****
2006年 6月 13日 (火) 20:33:52 JST


こんばんは、お世話になっております、カモノハシです。

5/7日付けで以下のようなメールを工藤さん宛てに直送していたのですが、スパムに
紛れてしまいましたでしょうか。
ちなみに、こちらのMLの「In-Reply-To」ヘッダがMLの投稿アドレスではなく、投稿
者の物になっているのは私の所だけなのでしょうか。
そのためいつの間にか直送していたことに先ほど気づきました(汗)。



> 0.91公開後再度ご確認ください。
new2が使えることを確認しました。
どうも有り難うございます。

ただ、いくつか分からないことがあるのですが、よろしいでしょうか。

・mecab_new2 の引数に「--dicdir=DIR」を指定しても読み込まない?
・mecab_strerror がNULLだったりNULL終端されていないことがある?
・mecab_sparse_tonode の使い方

mecab_new2 に"--output-format-type=wakati --dicdir=辞書パス"を渡しても正常
に起動しませんが、rcfileを介さないとダメなのでしょうか。

また、mecab_strerrorですが、以下のmecab_sparse_tonodeの実験でNULLが帰ってし
まいます。また、どうにも結果が安定しないのですが、まれに
tagger.cpp(XXX): param.cpp(46): no such file or directory: "c:\proga..."
XXXがいくつかちょっとメモし忘れましたが、↑のようなかんじでエラーが出ると
きに、null終端が抜けている事がありました。


mecab_sparse_tonode 関数を使ってみようと末尾のようなサンプルを作ってみまし
たが、NULLばかりでいまいち分かりませんでした。
出力が
***************************
node->feature :: (NULL)
node->feature :: (NULL)
node->feature :: (NULL)
node->feature :: (NULL)
node->feature :: (NULL)
node->feature :: (NULL)
node->feature :: (NULL)
node->feature :: (NULL)
なぜかNULL
***************************
のようになってしまいます。mecab_new2 の引数をいろいろ変えてみてもまともな
値になりませんでした。これはどの様になるのが正しいのでしょうか?
コードは長いですがほとんどコピペと書き換えでサンプルと同じようなものです。
ちなみに、mecab_new2の戻り値は検査してます。

#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#define mecab_t void
struct mecab_node_t
{
    //http://mecab.sourceforge.jp/libmecab.htmlのコピペにつき略
};
typedef char* (_cdecl *MECAB_STRERROR)  (mecab_t*);
typedef void  (_cdecl *MECAB_DESTROY)   (mecab_t *);
typedef mecab_t* (_cdecl *MECAB_NEW2) (char*);
typedef mecab_node_t* (_cdecl *MECAB_SPARSE_TONODE) (mecab_t *m, const char *str);
MECAB_NEW2          mecab_new2        = NULL;
MECAB_STRERROR      mecab_strerror    = NULL;
MECAB_DESTROY       mecab_destroy     = NULL;
MECAB_SPARSE_TONODE mecab_sparse_tonode=NULL;
HINSTANCE hLib = NULL;
mecab_t* mecab;


int main()
{
    if( (hLib = LoadLibrary("libmecab.dll")) == NULL) return false;
    bool ferror = false;
    if((mecab_new2         =(MECAB_NEW2)         GetProcAddress(hLib, "mecab_new2")) == NULL) ferror=true;
    if((mecab_strerror     =(MECAB_STRERROR)     GetProcAddress(hLib, "mecab_strerror")) == NULL) ferror=true;
    if((mecab_destroy      =(MECAB_DESTROY)      GetProcAddress(hLib, "mecab_destroy")) == NULL) ferror=true;
    if((mecab_sparse_tonode=(MECAB_SPARSE_TONODE)GetProcAddress(hLib, "mecab_sparse_tonode")) == NULL) ferror=true;
    
    if(ferror){
        FreeLibrary(hLib);
        return false;
    }
    mecab_t* mecab = mecab_new2("--output-format-type=wakati --rcfile=c:\\mecab\\dic\\mecabrc");//適当に環境依存
    mecab_node_t *node;
    node = mecab_sparse_tonode(mecab, "成田空港開発公団株式会社専務理事");
    if(node!=NULL){
        for (; node != NULL; node = node->next) {
            cout << "node->feature :: ";
            if(node->feature==NULL){
                cout << "(NULL)";
            }else{
                cout << node->feature;
            }
            cout << endl;
        }
    }
    if(mecab_strerror(mecab)==NULL) cout << "なぜかNULL" << endl;
    mecab_destroy(mecab);
    FreeLibrary(hLib);
    return true;
}

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



Mecab-devel メーリングリストの案内
Back to archive index