←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3832

単語の出現頻度を求めるプログラム
投稿者---みつお(2005/05/30 20:33:28)


管理人様スペースお借りします。テキストファイルを入力してその中の単語の出現頻度を求めるプログラムなんですが、実行できず強制終了になってしまいます。何故か全くわかりません。ご教授お願いします。ちなみに
OSはXP、コンパイラはboland5,5です。
ソースは以下の通りです。
【main.c】
#include <stdio.h>
#include <stdlib.h>
#include "get_word.h"
#include "initialize.h"
#include "add_word.h"
#include "dump_word.h"
#include "finalize.h"   

int main (int argc,char **argv){
    
FILE *fp;   
char buf[1024];

if(argc==1){
     fp=stdin;
    }else{
        fp=fopen(argv[1],"r");
     if(fp==NULL){
        fprintf(stderr,"can't open.\n");
        exit(1);
     }
    }
    
    word_initialize();
    
while(get_word(buf,1024,fp)!=EOF){
    add_word(buf);
}

    dump_word(stdout);
    
    word_finalize();
    
    return 0;
}
        
     
        
        
        
    do{
        buf[len]=ch;
        len++;
        if(len>buf_size)
            fprintf(stderr,"long.\n");
    }while((ch=fgetc(fp))!=EOF&&isalnum(ch));
    
    buf[len]='\0';
                
    return len;
}

【initialize.h】
typedef struct{
    char *name;
    int  count;
}Word;

extern Word word_array[];
extern int num_of_word;

Word word_array[10000];
int  num_of_word;       

void word_initialize(void)
{
    num_of_word=0;
}   

【add_word.h】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void shift_array(int index)
{
    int src;
    
    for(src=num_of_word-1;src>=index;src--){
        word_array[src+1]=word_array[src];
    }
    num_of_word++;
}
static char *my_strdup(char *src)
{
    char *dest;
    
    dest=malloc(sizeof(char)*(strlen(src)+1));
    
    strcpy(dest,src);
    
    return dest;
}

void add_word(char *word){
    int i;
    int result;
    for(i=0; i<=num_of_word; i++){
        result=strcmp(word_array[i].name,word);
        if(result>=0)
        break;
    }
    if(num_of_word!=0&&result==0){
        word_array[i].count++;
    }else{
        shift_array(i);
        word_array[i].name=my_strdup(word);
        word_array[i].count=1;
    }
}   

【dump_word.h】
#include <stdio.h>


void dump_word(FILE *fp)
{
    int i;
    for(i=0; i<num_of_word; i++)
    fprintf(fp,"%s%d\n",word_array[i].name,word_array[i].count);
}   
        

【finalize.h】
#include <stdlib.h>

    
void word_finalize(void)
{
    int i;
    for(i=0; i<num_of_word; i++)
    free(word_array[i].name);
    
    num_of_word =0;
}   





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:単語の出現頻度を求めるプログラム 3833 もぐりん 2005/05/30 22:04:35
<子記事> Re:単語の出現頻度を求めるプログラム 3835 まきじ 2005/05/30 22:18:44


No.3833

Re:単語の出現頻度を求めるプログラム
投稿者---もぐりん(2005/05/30 22:04:35)


提示したソースは本当にコンパイルが通っていますか?
main.cで括弧の数が合っていないのにコンパイルが通るはずがないです。
それと、main.cのdo-while文はmain関数の外に記述されていますが何か意図していますか?
もう一度ソースを見直してみては?



この投稿にコメントする

削除パスワード

No.3834

Re:単語の出現頻度を求めるプログラム
投稿者---みつお(2005/05/30 22:16:25)


>提示したソースは本当にコンパイルが通っていますか?
>main.cで括弧の数が合っていないのにコンパイルが通るはずがないです。
>それと、main.cのdo-while文はmain関数の外に記述されていますが何か意図していますか?
>もう一度ソースを見直してみては?
すみません、書き込みの際のミスです。main.c以下のdo〜は、関係ありません。




この投稿にコメントする

削除パスワード

No.3835

Re:単語の出現頻度を求めるプログラム
投稿者---まきじ(2005/05/30 22:18:44)


>typedef struct{
> char *name;
> int count;
}Word;
>extern Word word_array[];
>extern int num_of_word;
>Word word_array[10000];
>int num_of_word;

は、initialize.h にしか記述されていないので、他のファイルで Word 型を
使うことはできないと思います。

add_word.h、dump_word.h、finalize.h で word_array、num_of_word が
使用されていますが定義されていない。

initialize.h に、

Word word_array[10000];
int num_of_word;

と定義して、他のファイルで、

extern Word word_array[];
extern int num_of_word;

と宣言すればよいと思います。

但し、Word型を使用できる様にしてから。


この投稿にコメントする

削除パスワード

No.3836

Re:単語の出現頻度を求めるプログラム
投稿者---みつお(2005/05/30 22:36:59)


>>typedef struct{
>> char *name;
>> int count;
>}Word;
>>extern Word word_array[];
>>extern int num_of_word;
>>Word word_array[10000];
>>int num_of_word;
>
>は、initialize.h にしか記述されていないので、他のファイルで Word 型を
>使うことはできないと思います。
>
>add_word.h、dump_word.h、finalize.h で word_array、num_of_word が
>使用されていますが定義されていない。
>
>initialize.h に、
>
>Word word_array[10000];
>int num_of_word;
>
>と定義して、他のファイルで、
>
>extern Word word_array[];
>extern int num_of_word;
>
>と宣言すればよいと思います。
>
>但し、Word型を使用できる様にしてから。
すみません、このように修正しましたがまだエラーというか強制終了になってしまいます。



この投稿にコメントする

削除パスワード

No.3837

Re:単語の出現頻度を求めるプログラム
投稿者---まきじ(2005/05/30 22:51:58)


>すみません、このように修正しましたがまだエラーというか強制終了になってしまいます。

initialize.h、add_word.h、dump_word.h、finalize.h らのファイルを 拡張子を .c にしてください。

あるいは、initialize.h に

>typedef struct{
> char *name;
> int count;
>}Word;
>Word word_array[10000];
>int num_of_word;

と定義して、他のファイルに include してください。

*get_word.h については、ソースが提示されていないので分かりません。


この投稿にコメントする

削除パスワード

No.3838

Re:単語の出現頻度を求めるプログラム
投稿者---みつお(2005/05/30 23:15:57)


>>すみません、このように修正しましたがまだエラーというか強制終了になってしまいます。
>
>initialize.h、add_word.h、dump_word.h、finalize.h らのファイルを 拡張子を .c にしてください。
>
>あるいは、initialize.h に
>
>>typedef struct{
>> char *name;
>> int count;
>>}Word;
>>Word word_array[10000];
>>int num_of_word;
>
>と定義して、他のファイルに include してください。
>
>*get_word.h については、ソースが提示されていないので分かりません。
すみません、どれも試したんですが無理です。get_word.cのソース乗せときます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int get_word(char *buf,int buf_size, FILE *fp){
    
    int ch;
    int len=0;
        
    /*最初の一連の空白文字は読み飛ばす*/
    while((ch=fgetc(fp))!=EOF&&!isalnum(ch))
        ;
    if(ch==EOF)
        return EOF;
        
    do{
        buf[len]=ch;
        len++;
        if(len>buf_size)
            fprintf(stderr,"long.\n");
    }while((ch=fgetc(fp))!=EOF&&isalnum(ch));
    
    buf[len]='\0';
                
    return len;
}




この投稿にコメントする

削除パスワード

No.3840

Re:単語の出現頻度を求めるプログラム
投稿者---まきじ(2005/05/31 00:01:02)


>すみません、どれも試したんですが無理です。get_word.cのソース乗せときます。

問題はそれだけじゃないと思います。
「メモリ参照エラー」とか出てるので、配列やポインターの操作する辺りで
何か間違ってるのでしょう。

あと、関数宣言も、extern にしないと駄目ですね。

関数用のヘッダファイルと変数用のヘッダファイルを作って、
そこに、extern を付けて宣言して、関数、変数を使ってるソースで
include すればよいと思います。


この投稿にコメントする

削除パスワード

No.3845

Re:単語の出現頻度を求めるプログラム
投稿者---elder(2005/06/01 01:09:31)


>あと、関数宣言も、extern にしないと駄目ですね。

関数宣言の場合、extern指定子は不要ではなかったでしょうか?


この投稿にコメントする

削除パスワード

No.3841

Re:単語の出現頻度を求めるプログラム
投稿者---おでん(2005/05/31 09:18:08)


void add_word(char *word){
    int i;
    int result;
    for(i=0; i<=num_of_word; i++){
        result=strcmp(word_array[i].name,word);
 ←ここでエラーになります。(ヒント:初めて実行される時、nameには何が入っていますか?)
        if(result>=0)        break;
    }
    if(num_of_word!=0&&result==0){
        word_array[i].count++;
    }
    else{
        shift_array(i);
        word_array[i].name=my_strdup(word);
        word_array[i].count=1;
    }
}



この投稿にコメントする

削除パスワード

No.3843

Re:単語の出現頻度を求めるプログラム
投稿者---みつお(2005/05/31 12:07:05)


何度もすみません、word_array[0]に何も格納されていないためバグがおきるのは分かりました。で以下のように変更したんですがまだ成功しません。誤りはないと思うのですがご指摘お願いします。
void add_word(char *word){
    int i;
    int result;
if(num_of_word>=1){
    for(i=0; i<=num_of_word; i++){
        result=strcmp(word_array[i].name,word);
        if(result>=0)
        break;
        }
    if(num_of_word!=0&&result==0){
        word_array[i].count++;
    }else{
        shift_array(i);
        word_array[i].name=my_strdup(word);
        word_array[i].count=1;
    }
}else{
    word_array[0].name=my_strdup(word);
    word_array[0].count=1;
    num_of_word++;
    
    }
}   




この投稿にコメントする

削除パスワード

No.3844

Re:単語の出現頻度を求めるプログラム
投稿者---みつお(2005/05/31 12:29:56)


すみません解決しました。i<=num_of_wordが間違ってました。アドバイスしてくださった方有難う御座いました


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity