- ベストアンサー
茶筅を使いたい!
茶筅を使って形態素解析を行いたいと思っています。 使う言語はC++です。 環境はborland C++ 5.5です。 サンプルプログラムを実行するのですが、 Error: 外部シンボル '_set_argument_parameters' が未解決(C:\PROGRAM FILES\CHASEN21\DLL\DLLTEST.OBJ が参照) Error: 外部シンボル '_analyze' が未解決(C:\PROGRAM FILES\CHASEN21\DLL\DLLTEST.OBJ が参照) というエラーがでます。 環境設定で、chadll.hのある場所まで設定しています。 (この辺の意味が全然わかりませんが) dllとかlibとかに疎いので、全然進めません。 どのようにすればうまく動かすことができますか?? サンプルプログラム #include <stdio.h> #include "chadll.h" int main(int argc,char** argv) { char input[10000] = "これは形態素解析のテストです。"; set_argument_parameters(argc,argv); printf( "%s", analyze( input ) ); return 0; }
- tkb_ht5
- お礼率43% (266/612)
- C・C++・C#
- 回答数3
- ありがとう数1
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
【方法1】 c:\chasen にインストールされていて、 c:\chasen\dll に dlltest.c, chasen.dll, chasen.lib, chadll.h 等があるとして、コマンド・プロンプトで、 |>cd c:\chasen\dll |>coff2omf chasen.lib chasenbcc.lib |COFF to OMF Converter Version 1.0.0.74 Copyright (c) 1999, 2000 Inprise Corporation | |>bcc32 dlltest.c chasenbcc.lib |Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland |dlltest.c: |警告 W8070 dlltest.c 19: 関数は値を返すべき(関数 main ) |Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland のようにします。(先頭に '>' が付く行が入力です) coff2omf で chasenbcc.lib を作ります。 次回コンパイルからは coff2omf の実行は必要ありません。 できた dlltest.exe と chasen.dll を c:\chasen にコピーして、 |>dlltest -r chasenrc |これ コレ これ 名詞-代名詞-一般 |は ハ は 助詞-係助詞 |形態素 ケイタイソ 形態素 名詞-一般 |解析 カイセキ 解析 名詞-サ変接続 |の ノ の 助詞-連体化 |テスト テスト テスト 名詞-サ変接続 |です デス です 助動詞 特殊・デス 基本形 |。 。 。 記号-句点 |EOS 【方法2】 Borland C++ 5.5.1 でも確認しました。 http://chasen.aist-nara.ac.jp/ml/chasen-users/msg00237.html ここのプログラム中の以下の2行 char *params[3] = {"chasen", "-j", 0}; (*set_argument_parameters)(2, params); を char *params[5] = {"chasen", "-j", "-r", "chasenrc", 0}; (*set_argument_parameters)(4, params); に変えて下さい。
その他の回答 (2)
関連するQ&A
- Chasen.dllをBCB5で使う方法を教えてください(DLLの使い方)
形態素解析ツールのChasen Win32版に付属しているchasen.dllを自作のプログラムから呼び出したいと思っています。 ・茶筅 http://chasen.aist-nara.ac.jp/index.html.ja ですが、DLLを使ったことがないのでよくわからずもう何日も困っています。 ヘッダで、まずDLL付属のヘッダー(下記参考資料)をインクルードして、 #include "chadll.h" 自作プログラムのソースで、 HINSTANCE chasenDLL = LoadLibrary("chasen.dll"); でライブラリをロードして、 char *myanalyze = (char *)GetProcAddress(chasenDLL,"analyze"); で関数analyzeを取り出していますが、 analyze()を実際に使うとシンボルの未解決エラーでコンパイルできません。 このDLLはBCBでは使えないのでしょうか。 ---------------------参考資料:DLL付属のサンプルソース /* * dlltest.c - ChaSen dll test program * * Copyright (C) 2000 Nara Institute of Science and Technology * * Author: H.Matsuda <horosi-m@is.aist-nara.ac.jp>, Sep. 2000 */ #include <stdio.h> #include "chadll.h" int main( int argc, char** argv ) { char input[10000] = "これは形態素解析のテストです。"; set_argument_parameters( argc, argv ); printf( "%s", analyze( input ) ); } ---------------------参考資料:DLL付属のヘッダーファイル /* * chasendll.h - ChaSen dll header * * Copyright (C) 2000 Nara Institute of Science and Technology * * Author: H.Matsuda <horosi-m@is.aist-nara.ac.jp>, Sep. 2000 */ __declspec( dllexport ) int set_argument_parameters( int argc, char** argv ); __declspec( dllexport ) char* analyze( char* input );
- ベストアンサー
- C・C++・C#
- 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); }
- 締切済み
- 大学・短大
- main( )
次の様なプログラムを作りました。 Dosプロンプトを開き、コンパイルで出来た、exeファイルのアドレスを渡しました。 例えば、2と3を引数として渡す時、 2 スペースを押す、 3 enter の順に行うと、エラーになります。 どの様に、引数を渡すのか操作方法を教えてください。 お願いします。 #include<stdlib.h> #include<stdio.h> int main(int argc, char *argv[]) { if(argc!=3){ printf("2つの数を指定してください。"); exit(1); } printf("%f",atoi(argv[1])+atoi(argv[2])); return 0; }
- ベストアンサー
- C・C++・C#
- C言語でコマンドラインの引数について。
コマンドラインで引数をわたす基本的なプログラムは main(int argc,char *argv[]){....] ですよね。 今回実行時に、 >実行ファイル名 123 + 233 といれたら、123+233を計算してくれるプログラムを作ろうとしています。 その場合、main(int argc,int *argv[]){} としたら、argv[1]に123が入って、argv[2]に+が入って、argv[3]に233が、入るというわけではないんでしょうか? とりあえず、確認で #include<stdio.h> main(int argc,int *argv[]) { printf("%d\n%d\n",argv[1],argv[3]); } としてみたんですが、実行結果は、とても長い数字がでてきてきました。 なにがいけないのか教えてください。 お願いします。 あとWindows MEでVC++6を使ってます。
- ベストアンサー
- C・C++・C#
- 探索アルゴリズム
テキストファイルを読み込んで、該当する文字列を含む行を表示するというプログラムを作りたいのです。ファイルを読み込むことはできるのですが、該当する文字列を含む行を表示するやり方がわかりません。どなたか助けてもらえないでしょうか? 一応私が作ってみたプログラムはこんな感じになったんですけど・・・ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fp; char ch; if( argc != 3) { printf(" 使用法 : <プログラム名> <ファイル名> <文字> \n"); return -1; } if((fp = fopen(argv[1],"r")) == NULL) { printf("ファイルを開くことができません\n"); return -1; } while(( ch = fgetc(fp)) != EOF) if(ch == *argv[2]) { printf("%cが見つかりました\n",ch); break; } fclose(fp); return 0; }
- 締切済み
- C・C++・C#
- BCC・stdio.h・_stddef.hのエラー
BCCと同梱されているstdio.hのエラーなのですが、 stdio.hのエラーは他では出なかったので、 ソース自体がおかしいのかと思っていますが、よく分かりません。 一応ソースを載せます。 #include <stdio.h> int main(int argc, char *argv[]) { if(argv[1] == "") { printf("---(Ver1.00.01)\n"); printf("easy.exe [filename]\n"); printf(" [filename] - ファイル名を指定してください.\n"); } return 0; } これによって次のエラーを吐いてきます。 エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\_stddef.h 53: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\_stddef.h 72: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 51: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 104: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 105: 宣言が正しく終了していない エラー E2293 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 140: ) が必要 エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 150: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 151: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 152: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 154: 宣言が正しく終了していない エラー E2293 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 155: ) が必要 エラー E2293 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 156: ) が必要 エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 160: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 161: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 162: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 164: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 165: 宣言が正しく終了していない エラー E2141 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 166: 宣言の構文エラー エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 172: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 173: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 174: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 175: 宣言が正しく終了していない エラー E2141 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 177: 宣言の構文エラー エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 181: 宣言が正しく終了していない エラー E2040 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 188: 宣言が正しく終了していない エラー E2228 C:\[本名のローマ字表記] Program Files\Borland\bcc32\include\stdio.h 188: エラーあるいは警告が多すぎる stdio.h,_stddef.hのソースは一切変えたりしていません。 また、BCCのエラーは、stdio.hとprintfを抜いて int main(int argc, char *argv[]) { if(argv[1] == "") { } return 0; } としたときに 宣言が正しく終了していない と表示されます。 環境は WindowsXP SP1 BCC Developer です。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- コマンドライン引数
コマンドライン引数で以下のようなプログラムを実行したいのですが どうしたらいいのか分かりません!! みなさんの意見を聞かせてください(lll´Д`lll) □☆□□□☆□□□☆□□□☆□ ☆★☆☆☆★☆☆☆★☆☆☆★☆ □☆□□□☆□□□☆□□□☆□ □☆□□□☆□□□☆□□□☆□ ☆★☆☆☆★☆☆☆★☆☆☆★☆ □☆□□□☆□□□☆□□□☆□ □☆□□□☆□□□☆□□□☆□ ☆★☆☆☆★☆☆☆★☆☆☆★☆ □☆□□□☆□□□☆□□□☆□ □☆□□□☆□□□☆□□□☆□ プログラムは途中まで作ったのですが、肝心なとこは 全く分りませんっっ #include <stdio.h> int main(int argc, char *argv[]) { int yoko, tate, i, j; if( argc < 3 ) return(1); sscanf( argv[1], "%d", &yoko ); sscanf( argv[2], "%d", &tate ); for( j = 0; j < tate; j++ ) { printf("\n"); } return(0); } /* end of pat2.c */
- 締切済み
- C・C++・C#
- ポインタについて
こんにちは。「独習C」で独学している者です。その中の練習問題をやっていました。課題はコマンドラインから引数を受け取り各文字に1を加え暗号化して表示するというものでした。 自分で考え一応ちゃんと動くものが書けました。その後もっとシンプルにならないかと少しずつ余分な所を削っていき以下のようになりました。 #include <stdio.h> int main(int argc,char *argv[]) { char ch; if(argc != 2){ printf("引数が正しくありません"); exit(1); } else while(*argv[1] != '\0'){ printf("%c",*(argv[1]++) + 1); } return 0; } できた、できたと喜んでいたのですがソースをよく見ていると*(argc[1]++)の所を見てあれっと思いました。これでは文字列の二番目の要素からしか表示できないのではないのかと思ったのです。しかし動かすとちゃんと動くのです。ちゃんと1番目の要素も表示されるのです。自分としては++を消して次の行にargv[1]++を付け加えればいいと思ったのですがどうでしょうか?(←これでもちゃんと動きました)私のポインタに対する考え方が間違っているのでしょうか?よろしくお願いします。
- ベストアンサー
- C・C++・C#
- sys/types.hの必要性について
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> int main (int argc,char *argv[]) { struct stat buf[2],*p; if(argc!=3) { fprintf(stderr,"Usage:newer file1 file2\n"); exit(EXIT_FAILURE); } p=buf; if(stat(argv[1],p)<0) { perror("stat"); exit(EXIT_FAILURE); } p++; if(stat(argv[2],p)<0) { perror("stat"); exit(EXIT_FAILURE); } if(buf[0].st_mtime>buf[1].st_mtime) { printf("%s\n",argv[1]); } else { printf("%s\n",argv[2]); } return EXIT_SUCCESS; } 上記のプログラムでは<sys/types.h>を使っていますが、 どこの部分で必要になるのでしょうか? プログラム貼り付けて非常に見づらくてすいません
- ベストアンサー
- C・C++・C#
- 全くわかりません。
C言語の課題が全くわかりません。 (1)~(5)には何が入りますか? 丸投げですいません。後でじっくり考えます。 お願いします。 コマンド行引数に整数と符号(+、ー)を指定し、 その和を表示するプログラム。 例%calc -5+10+100-10=95と表示するプログラム #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { int sum=0,i=1; if(argc(1)1) put("komanasi"); else if(argv[i],(2)=='+'){ i++; sum += atoi(argv[i(3)]); }else if (argv[i],(2)=='-'){ i++; sum-=atoi(argv[i(3)]); }else sum+=atoi(argv[i(3)]); while((4)<(5)){ if(argv[i],(2)=='+'){ i++; sum+=atoi(argv[i(3)]); }else{ i++; sum-=atoi(argv[i(3)]); } } printf("%d\n",sum); return(0); }
- ベストアンサー
- C・C++・C#
お礼
ありがとうございましたm(_ _)m