• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C/C++で漢字の読みを取得したいです。)

C/C++で漢字の読みを取得する方法

このQ&Aのポイント
  • C/C++で漢字の読みを取得する方法について質問です。以下のコードで実行時エラーが発生してしまいます。解決策を教えてください。
  • 初心者のため、ライブラリの設定やプロジェクトの設定方法を教えていただけませんか?また、ソースコードの一部も教えていただけると幸いです。
  • 動作させるためには、libkakasi.hやkakasi.libなどの必要ファイルの場所を教えていただけませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

無視されたけどめげずに答えましょう 1. libkakasi.hとkakasi.libとkakasi.dllの3個のファイルを C\Users\me\Documents\Visual Studio 2005\Projects\oto_0714\ にコピーします 2. ソースファイル名をoto_0714.cに変えます 3. プログラムは以下の通り #pragma comment(lib, "kakasi.lib") #include <stdio.h> #include "libkakasi.h" int main(void) { char* hiragana = NULL; char* argv[] = {"kakasi", "-JH", "-kH"}; if(kakasi_getopt_argv(3, argv) != 0) { printf("error1\n"); return 0; } hiragana = kakasi_do("文"); if(hiragana == NULL) { printf("error2\n"); return 0; } printf("%s\n", hiragana); printf("%s\n", "a"); kakasi_free(hiragana); return 0; }

hatokamome
質問者

お礼

いつもご回答ありがとうございます。 無視してしまってすみませんでした。 エラー処理も大変参考になりました。 以前の質問も含め、全ての方がベストアンサーだと感じております。 今後ともご教授お願いいたします。 本当にありがとうござしました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

質問に答えていなかったようなので、回答します。 # ただし、そちらの環境は掲示されていないようですので、当方の環境で…ですが。 >1.libkakasi.hやkakasi.libなどの必要ファイルの置く場所 >2.プロジェクトの設定 >3.ソースコード 1.について… kakasi-2.3.4.zipを展開して、ディレクトリごとC:\にコピーします。 付属のドキュメントに従って、環境変数を設定します。 WindowsXPなので、システムのプロパティからユーザー環境変数に設定します。 設定内容は付属ドキュメント(README-ja.win32)の40行目から記述されている通りです。 ただのテキストですから、そのままメモ帳なりで開いて下さい。 # ただし、当方ではpathの設定は行っていません。 2.について… Microsoft Visual C++ 2008 Express Editionを起動し、新規プロジェクトの作成に入ります。 [ファイル][新規作成][プロジェクト]で、「Win32 コンソール アプリケーション」で作成、 「空のプロジェクト」として作成します。 作成後、プロジェクトのプロパティを開き、文字セットを「マルチ バイト文字セットを使用する」に 変更して、一度閉じます。 ソリューションエクスプローラのソースで右クリックし、[追加][新しい項目]でプロジェクトにソースを追加します。 中身は空ですが、後ほど編集することにして… 再度プロジェクトのプロパティを開きます。 「C/C++」という項目が追加されているはずですので、そちらをクリックし、 右側の「追加のインクルード ディレクトリ」に「C:\kakasi\include」を設定して閉じます。 3.ソースコードについて… 質問に掲示されたソースコードを貼り付けます。 再三指摘しているLoadLibrary()を "C:\\kakasi\\bin"から"C:\\kakasi\\lib\\kakasi.dll"に書き換えます。 # 当方ではpathを変更しませんでしたので、 # char* argv[] = {"kakasi", "-JH","-kH"}; # を # char* argv[] = {"C:\\kakasi\\bin\\kakasi", "-JH","-kH"}; # に変更しています。 ビルドして実行するとコンソールに ぶん a と表示されます。

hatokamome
質問者

お礼

解決できました。 完全なご回答を頂きありがとうございます。 教えて頂いた知識を調べ理解しようと思います。 本当に助かりました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

とりあえず、エラーチェックは最低限しましょう。 というか前から回答が付いていたような気まするけど・・・ >HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); 拡張子が .dll のフルパスを指定する。 C:\kakasi\bin\kakasi.dll だったら HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin\\kakasi.dll"); そして、正常にロードできているか戻り値を確認する。 NULLであれば、dllの場所が違う。 そもそも、ヘッダファイルとライブラリファイルをリンクするのであれば、 動的リンクであるLoadLibraryを使わなくてもいいのですが。

hatokamome
質問者

お礼

おかげさまで動作しました。 libやdllを理解しなければならないと思います。 助かりました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

http://okwave.jp/qa/q6050258.html で、 >HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); はまずい。 と、回答が2つも付いていますよね? そちらは無視ですか? 私の回答では具体的な修正ケースを記述していませんが、 php504さんがDLLの名前まで記載してくれていますよね? フルパスで書かないと通じませんか? で、なぜ落ちているのかというと… LoadLibrary()に失敗しているのに突撃している為、 GetProcAddress()がNULLポインタを返却しているハズです。 そして、こちらでも失敗しているのに特攻してNULLポインタアクセスでOSにより救済され、 お行儀の悪いプロセスだけが殺された結果です。 停止した際にIDEなどでデバッグしようとすると、kakasi_getopt_argv()の行でエラーになっているハズです。 その際、変数の内容を確認出来る状態であれば、 hKakasiDLL・kakasi_getopt_argv・kakasi_do・kakasi_freeの全てがNULLになっていることでしょう。 エラー処理を一切していないので当たり前の結果となります。

hatokamome
質問者

お礼

おかげさまで動作しました。 すみません再度質問する前に、難しすぎて迷っていて このような失礼をしてしまいました。 今後気をつけます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C/C++で漢字の読みを取得したいです。

    C/C++で漢字の読みを取得したいです。 kakasiで以下のようなエラーになってしまいます。 ファイルの設定は ネット上のサンプルを参考にし、LoadLibrary・GetProcAddressなどの関数を使いました。 以下の実行時エラー・警告が出てしまいました。 どこが問題ないのか解りません。ご存知の方がおられましたら教えてください。よろしくお願いいたします。 1>------ ビルド開始: プロジェクト: oto_0714, 構成: Debug Win32 ------ 1>コンパイルしています... 1>oto_0714.cpp 1>c:\users\me\documents\visual studio 2005\projects\oto_0714\oto_0714.cpp(12) : warning C4996: 'putenv': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _putenv. See online help for details. 1> c:\program files\microsoft visual studio 8\vc\include\stdlib.h(900) : 'putenv' の宣言を確認してください。 1>c:\users\me\documents\visual studio 2005\projects\oto_0714\oto_0714.cpp(13) : warning C4996: 'putenv': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _putenv. See online help for details. 1> c:\program files\microsoft visual studio 8\vc\include\stdlib.h(900) : 'putenv' の宣言を確認してください。 1>ビルドログは "file://c:\Users\me\Documents\Visual Studio 2005\Projects\oto_0714\Debug\BuildLog.htm" に保存されました。 1>oto_0714 - エラー 0、警告 2==== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ========== #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "libkakasi.h" void main(void){ HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" );; char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" ); int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" ); putenv( "ITAIJIDICTPATH=C:\\kakasi\\share\\kakasi\\itaijidict"); putenv( "KANWADICTPATH=C:\\kakasi\\share\\kakasi\\kanwadict"); char* argv[] = {"kakasi", "-JH","-kH"}; kakasi_getopt_argv(3,argv); char* hiragana = kakasi_do("文"); printf("%s\n", hiragana); kakasi_free(hiragana); FreeLibrary(hKakasiDLL); }

  • 漢字の読みを表示するプログラム

    漢字の読みを表示するプログラム C/C++で漢字の読みを取得したいです。 kakasiを利用してみましたが、以下のようなエラーになってしまいます。 エラー内容:実行時エラーで、「○○.exeは動作を停止しました。」となります。 OS:Vistaです。 環境変数はマニュアル通りに設定しました。 ソースはネット上のサンプルを参考に書きましたが、 LoadLibrary・GetProcAddressなどの関数の意味がmsdnを見ても解りませんでした。 (環境変数に設定しない場合の書き方なのかもしれないと思い、消してみましたが、 そうすると多数のコンパイルエラーになってしまいます。) まずは動かしてみたいのです。よろしくお願いいたします。 以下エラーが出るソースです。 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "libkakasi.h" void main(void){ HMODULE hKakasiDLL = LoadLibrary("C:\\kakasi\\bin"); int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" ); char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" ); int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" ); putenv( "ITAIJIDICTPATH=C:\\kakasi\\share\\kakasi\\itaijidict"); putenv( "KANWADICTPATH=C:\\kakasi\\share\\kakasi\\kanwadict"); char* argv[] = {"kakasi", "-JH","-kH"}; kakasi_getopt_argv(3,argv); char* hiragana = kakasi_do("漢字"); printf("%s\n", hiragana); kakasi_free(hiragana); FreeLibrary(hKakasiDLL); }

  • C言語のシェルプログラミングの課題が分かりません。

    C言語のシェルプログラミングを作れという課題で、以下のように作ったんですが、実行して何度かコマンドを入力した後、exitによって一発で終わらせることができません。どのように書き換えればいいか教えて下さい。 また、他にも書き換えた方がよいと思えるところがあったら是非教えて下さいm(_ _)m #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #include <sys/types.h> #include MAX_ARGS 10 #include MAX_LEN 100 extern char **environ; void child(int argc, char *argv[MAX_ARGS]); int main(void){ int argc, n = 0; int status; char input[MAX_LEN], *argv[MAX_ARGS], *cp; const char *delim = "\t\n"; while (1){ ++n; printf("$ "); fflush(stdout); if(fgets(input, sizeof(input), stdin) == NULL){ break; } cp = input; for(argc = 0; argc < MAX_ARGS; argc++){ if((argv[argc] = strtok(cp, delim)) == NULL) break; cp = NULL; } if(strcmp(argv[0], "exit") == 0){ exit(0); } pid_t pid = fork(); if(pid == -1){ perror("fork"); exit(1); }else if(pid == 0){ child(argc, argv); }else{ wait(&status); } } return 0; } void child(int argc, char *argv[MAX_ARGS]{ execvp(argv[0], argv); }

  • 関数へ引数を渡す時・・・(C言語)

    Cを始めたばかりです。 レベルの低い質問だと思いますがお願いします。 【ソース】 /* a1.c */ #include <stdio.h> void aaa(char); int main( int argc, char *argv[] ) { char box[] = "test"; aaa(box); return 0; } /* a2.c */ #include <stdio.h> void aaa(char box) { printf( "%s",box ); } 【質問】 変数boxの中身を関数aaaに渡したいだけですが、 上記ソースをコンパイルすると、a1.cの aaa(box) の部分でエラーが出てしまいます。 どうもデータ型(ポインタ?)がまずいようですが、 何が問題なのでしょうか? 御回答宜しくお願い致します。

  • OpenCVでの画像サイズ取得について教えてください。

    OpenCVでの画像サイズ取得について教えてください。 rawデータをjpgにして取得し、その画像を4分割したいのですがエラーが3つ出てしまいます。 環境はVisual Studio2008です。 いろいろと調べたのですが、原因や対策がはっきりわからず、書き変えてもNGで困っています。 エラー:その1 「error LNK2028:未解決のトークン(0A00007B)"extern "C" struct IplImage *_cdecl cvLoadImage(char const roi.obj*.int)"(cvLoadImage@@$$J0YAPAU IplImage@@PBDH@Z)が関数"int _codecl main(int,char * *)"(?main@@$$HYAHHPAPAD@Z)で参照されました。」 エラー:その2 「error LNK2019: 未解決の外部シンボル"extern "C" struct IplImage * codecl cvLoadImage(char const *.int)" (?cvLoadImage@@$$J0YAPAU IplImage@@PBDH@Z)が関数"int_codecl main(int, char * *)" (?main@@$$HYAHHPAPAD@Z)で参照されました。」 エラー:その3 「fatal error LNK1120: 外部参照2が未解決です] '================== #pragma warning(disable : 4819) #include <cv.h> #include <highgui.h> #include <stdio.h> #define DIVX (4) #define DIVY (4) #define DIVXY (DIVX*DIVY) int main (int argc, char **argv) { int w, h IplImage *img=0; img=cvLoadImage("C:\・・・\\testfile.jpg, CV_LOAD_IMAGE_GRAYSCALE); w = img->width - img->width % DIVX + DIVX; h = img->height - img->height % DIVY + DIVY; printf("幅は%w, 高さは%h です。 \n"); } '=============================================== 画像サイズを取得し、画像を4分割したあと、画素値を変更したいと思っています。 できればjpgに変換せず、rawデータそのものの精度の画像を直接扱いたいのですが、 その場合、cvLoadImageでどう表記すると実現できるのでしょうか。 また、OpenCVのグレースケールは、何チャンネルなのでしょうか。 プログラム経験はありますが、OpenCVを使うため、C言語の勉強も始めたばかりです。 なにか見当違いな質問をしていたら申し訳ありません。 お忙しいところすみませんが、もしどなたか解決策をアドバイスいただける方がいらっしゃると 大変助かります。 どうぞ宜しくお願い致します。

  • C言語の変数について

    C言語の変数について教えていただきたいです。 C言語で下記のような設定をした場合、変数A、Bに設定する値にはバイト数制限 はないのでしょうか? バイト数制限がなくなる場合、なぜそうなるのかを教えていただきたいです。 よろしくお願いします。 #include <stdio.h> void test( char **B); int main( int argc, char *argv[] ) { char *A = NULL; char *B = NULL; A = argv[1]; test( B ); return 0; } void test( char **B ) { strcpy(B, "ABCD"); return 0; }

  • 【C】引数の変換をする場合どちらの方法を使うべきでしょうか?

    int main(int argc, char* argv[]) { int i; /* argv[1]をintになおして格納用 */ 処理 } という感じでメインを作ると思いますが 引数のargv[0]はファイルの絶対パス argv[1]には"必ず"数字(整数)が入っていると仮定して argv[1]をint型に変換する場合 (1) sscanf(argv[1], "%d", &i); とするか (2) stdlib.hをインクルードして i = atoi(argv[1]); とするかの二通りをとりあえず思いついたのですが どちらもintに変換された値が入るわけですが C言語になれておられる方なら普通どちらをつかいますか? (1)or(2) 又はそれ以外の方法、どっちでも良し、場合によるetc... ご意見よろしくお願いします。

  • MacでC言語を勉強してみてるのですが

    最近C言語に興味を持って 趣味程度に、ハーバート・シルトさん著の「独習C」を、 Xcodeを使ってCが使える感じにして、 プログラミングを打って、ビルドして、コンソールで結果を見て、ふむふむ、ってやっていたのですが、 7章の4節でコマンドライン引数というものが出てきて、 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; double d; long l; i = atoi(argv[1]); l = atol(argv[2]); d = atof(argv[3]); printf("%d %ld %f", i, l, d); return 0; } という例題のプログラムの結果を見たいのですが、コマンドラインというものがどうすればXcodeで見られるのかよくわかりません。 ぜひ助けてください。コンソールには出ないんですよね・・・?

    • ベストアンサー
    • Mac
  • C言語で分からないところがあるのですが・・・

    すみません。C言語で分からないところがあったので来ました。 ユーザから数字を任意の数だけ受け取って、その数字とその和を表示するプログラムです。atoiなる関数、そしてコマンドライン引数というのを使って考えてみた結果を下に書きましたので、どなたか修正してください。お願いします。 実行結果(のイメージ図) 20 39 4 sum 20 39 4 63 途中までのソースコードです。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc,char *argv[]) { int sum; int n,i; printf("How many numbers INPUT?: "); scanf("%d", &n); for(i = 0; i <= n; i++){ atoi(argv[i]); } sum = printf("%d",sum); return 0; }

  • VisualStudio C++の初期設定で困っています。

    Visual Studio C++でOpenCVを使って、画像処理系のプログラムの練習をしています。 家のパソコンは初期のvistaを使っていてそこでは出来たんですが、 2台目のWindows7搭載型のノートではエラーが出て進みません。 エラー内容は fatal error LNK1104:ファイル'highgui.h'を開くことができません。 とでます。 ソースは #include "highgui.h" #include "cv.h" int main(int argc, char** argv){ cvNamedWindow("sample"); IplImage* src = cvLoadImage("sample.jpg"); cvShowImage("sample",src); cvReleaseImage( &src ); cvDestroyWindow("sample"); } 開発環境が7の64ビットに変わったからっていうのもあるのかと思っていますが、よくわかりません。エラーの内容で検索をかけてやってみたのですが、いまいちわからなかったので質問させてもらいました。よろしくお願いします。