質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2400閲覧

VC++での他のexe、binフォルダの使用について

inakaga883

総合スコア20

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/09/28 16:37

編集2016/10/01 04:29

依頼変更:
MeCabという形態素解析ソフトを使っています。

char input[100]; //入力された文字を代入していますがここではコードを省略。
MeCab::Tagger *tagger = MeCab::createTagger("");
const char *result = tagger->parse(input);

2行目のところで「System.NullReferenceException」というエラーが出てきます。

システムの環境設定でCドライブのにあるMeCab\binフォルダまでパスを通せばこのエラーが出てきません。
私がやりたいのは、VC++で作成しているprojectフォルダにMeCabフォルダを入れてそのフォルダ毎相手に渡せば、MeCabをインストールしていない人でもシステムの環境設定をせずに、渡されたプロジェクトを実行できるプログラムを作りたいと思っています。
VC++で、projectフォルダ内のMeCabフォルダまでの相対パスを指定して、使用することは可能なのでしょうか?

もし不可能なら外部のexeファイルをコマンド付きで実行できる方法はあるのでしょうか?

[projectフォルダ]
--[MeCab]
----[bin]
------[mecab.exe]
--[Debug]
----[○○.exe]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

htsign

2016/09/28 23:42

`System.NullReferenceException` とは .NET Frameworkが出力するエラーの一つで、C++で開発していることはあまり関係ありません。 操作を実行しようとしている変数に nullptr が入っていると起こることが多いです。 エラーが出ているソースコードを提示すると回答が返ってきやすいと思います。 私自身はC++/CLIに疎いですが、この質問内容ですと詳しい方でも書き込みにくいです。
guest

回答1

0

ベストアンサー

MeCab::createTagger()の使い方を知らないので、正確なことは言えませんが、
お言葉通り、2行目のところで「System.NullReferenceException」ならば、MeCabにバグがあります。

回避策は:
・MeCab::createTagger()に正しい引数を渡す。

C++

1MeCab::Tagger *tagger = NULL; 2 3try { 4 tagger = MeCab::createTagger(""); 5} 6catch (...) { 7 /* 適切な処理 */ 8 return; 9}

3行目のところで「System.NullReferenceException」ならば、
MeCab::createTagger("")がNULLを返し、その値がparse()のthisとなり、parse()内部でメンバ変数を参照したために、System.NullReferenceExceptionがthrowされたのでしょう。

回避策は:
・NULLを絶対に返さないようにMeCab::createTagger()に正しい引数を渡す。
・if (tagger == NULL) { /* 適切な処理 */ }
いずれかまたは両方を行い、parse()のthisにNULLが決して渡らないようにすればよいと思います。

おっしゃる通り、可能性のある環境設定の内容にかかわらずプログラムは異常終了するべきではないですね。開発者でなければ「System.NullReferenceException」の意味がわからず、どう対処すればいいかわからないですから。

ただ、ご開発のプログラムはMeCabがインストールされていることが前提条件ではないでしょうか?そうならば、MeCabがインストールされていないことを検出し、「MeCabがインストールされていないので、プログラムが正しく実行できません。MeCabを正しくインストールしてください。」等のメッセージを表示して、プログラムを中断することがよいと思います。

「フォルダにMeCabフォルダを入れてそのフォルダ毎相手に渡せば」とありますが、MeCabは二次配布OKなライセンスなのですか?第3者のソフトを利用し開発したプログラムをリリースする場合、そのソフトのライセンスに厳格に従う必要があります。

「外部のexeファイルをコマンド付きで実行できる方法」はありますが、mecab.exeを単に実行するだけではご期待の結果は得られないと思います。

投稿2016/10/01 19:38

naomi3

総合スコア1105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inakaga883

2016/10/02 03:39

詳しく教えていただきありがとうございました。 MeCabはオープンソースであり、このソフトを変更して作成されているものもありますが、詳しくは分からないので、相手にはMeCabをインストールしてもらおうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問