2016-09-16 30 views
1

無限ループを取得するが、私は「//」私はfseek関数()ワンセグエラーを取得開始二つのループ...ファイルの無限ループ/セグメンテーションエラー

目的...外にしようとすると、共通見つけるにはファイル間のフレーズ(単語のグループ化)。

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define CONTENTS 20000 
#define MAXFILES 30 
#include "hash.h" 


void printOutput(int numFiles, int output[30][30]) 
{ 
    int i, j; 
//print output matrix 
for (i = 0; i < numFiles; i++){ 
    printf("f%d ", i + 1); // print upper row of file names, use 4 spaces 
} 

for (i = 0; i < numFiles; i++){ 
    if (i > 8) // if file marker is 2 digits, use 2 spaces 
    { 
     printf("f%d ", i + 1); // print upper row of file names 
    } 
    else printf("f%d ", i + 1); // else file marker is 1 digit, use 3 spaces 

    printf("\n"); 
    for (j = 0; j < numFiles; j++){ 
     // the following if else statements manage the spacing for various numbers, soley for aesthetic purposes 
     if (output[i][j] == 45){ // print the dash character 
      printf("%c  ", output[i][j]); // use 5 spaces 
      continue; 
     } 
     else if (output[i][j] > 9 && output[i][j] < 100){ // if 2 digit number, 4 spaces 
      printf("%d ", output[i][j]); 
      continue; 
     } 
     else if (output[i][j] > 99 && output[i][j] < 1000){ // if 3 digit number, 3 spaces 
      printf("%d ", output[i][j]); 
      continue; 
     } 

     else if (output[i][j] > 999 && output[i][j] < 10000){ // if 4 digit number, 2 spaces 
      printf("%d ", output[i][j]); 
      continue; 
     } 
     else if (output[i][j] > 9999){ // if 5 digit number, 1 space 
      printf("%d ", output[i][j]); 
      continue; 
     } 
     else printf("%d  ", output[i][j]); // 1 digit number, 5 spaces 
    } 
    printf("\n"); 
} 
} 


int main(int argc, char *argv[]) 
{ 
    int group_length, valid; 
    int list[30]; 
    //Range checking 
    while(valid == 0) 
{ 
    printf("What is the number of words to analyze (2 - 10)?\n"); 
    scanf("%d",&group_length); 

    if((group_length < 2) || (group_length > 10)) 
     printf("\n"); 
    else 
     valid = 1; 
    } 

    struct node * Map[30]; 
    int f; 
    for(f = 0; f < 30; f++) 
    { 
    Map[f] = createHash(2000); 
    } 

    FILE *fp; 
    int i, numberF = 0; 
    int output[30][30]; // upper triangular output matrix 
    char name[CONTENTS]; 
    char fnames[CONTENTS]; 
    fp = fopen("inputfile.txt", "r"); 
    char *names = malloc(sizeof *names); 
    int *SequenceList = malloc(sizeof *SequenceList); 
    //int *SequenceList malloc(MAXFILES * sizeof(int *)); 
    int seq; //Sequence 
char entireFile[CONTENTS]; 
char *wordArray[CONTENTS]; 
char *token2, *search = " \r\n\t"; 

for (i = 0; fgets(name, 100, fp) != NULL && i < MAXFILES; i++) 
{ 
    ++numberF; 
    char *token = NULL; //setting to nukl before using it to strtok 
    token = strtok(name, ":"); 
    strtok(token, "\n");//Getting rid of that dirty \n that I hate 
    strcat(&fnames[i], token); 
    //Part 2: 
    FILE *fpp; 
    fpp = fopen(fnames,"r"); 
    fseek(fpp, 0, SEEK_END); 
    int inputLength = ftell(fpp); 
    rewind(fpp); 
    //Reads data from a given stream into an array pointed to 
    fread(entireFile, inputLength, 1, fpp); 
    fclose(fpp); 
    //Closing file 
    token2 = strtok(entireFile, search); 
    seq = 0; 
    //wordArray[seq] = token2; 
    char temp[CONTENTS]; 

    while (token2 != NULL) 
    { 
     while(seq < group_length) 
    { 
     token2 = strtok(NULL, search); 
     wordArray[seq] = token2; 
     strcpy(temp, wordArray[seq]); 
     insertHash(Map[i], temp, SequenceList[i]); 
     seq++; 
     //output[i] = Map[i]->counts[i]; 
    } 
    }//End of token2 NULL loop 

    } 

    //closing inputfile.txt... Presuming now is best time 
    fclose(fp); 

    //Printing and calling printOutput function 
    int k, l; 
    for (k = 0; k < 30; k++) 
     for (l = 0; l < 30; l++) 
     output[k][l] = 45;  
    printOutput(numberF, output); 

return 0; 

}

私が話している正確に何のスニペット...:私のhash.cの

FILE *fpp; 
    fpp = fopen(fnames,"r"); 
    fseek(fpp, 0, SEEK_END); 
    int inputLength = ftell(fpp); 
    rewind(fpp); 
    //Reads data from a given stream into an array pointed to 
    fread(entireFile, inputLength, 1, fpp); 
    fclose(fpp); 
    //Closing file 
    token2 = strtok(entireFile, search); 
    seq = 0; 
    //wordArray[seq] = token2; 
    char temp[CONTENTS]; 

    while (token2 != NULL) 
    { 
    while(seq < group_length) 
    { 
     token2 = strtok(NULL, search); 
      wordArray[seq] = token2; 
     strcpy(temp, wordArray[seq]); 
     insertHash(Map[i], temp, SequenceList[i]); 
     seq++; 
     //output[i] = Map[i]->counts[i]; 
    } 
    }//End of token2 NULL lo 

コード(それが満了していないと公開されていないことを確認しました):http://pastebin.com/Cz4R7WwK // ヘッダを更新:http://pastebin.com/ex2zARGt

編集: 最新の追加後に新しいsegエラーが発生するここでhash.c の私insertHashのCMPの一部と取得ワンセグエラーがinsertHashに

scratch_Hash.c: In function ‘insertHash’: 
scratch_Hash.c:47:4: warning: passing argument 1 of ‘hash’ discards ‘const’ qual ifier from pointer target type [enabled by default] 
ha = hash(info)%200; 
^ 
scratch_Hash.c:31:15: note: expected ‘unsigned char *’ but argument is of type  const char *’ 
unsigned long hash(unsigned char *str) 
        ^
scratch_Hash.c:57:12: warning: assignment from incompatible pointer type [enable d by default] 
    node = node->next; 
     ^
scratch_Hash.c:64:18: warning: assignment from incompatible pointer type [enable d by default] 
newNode->next = table[ha]; 

私は後で行うことができる2つの第一が、incompatileポインタ型を心配して警告しています。この場合、どうすれば解決できますか?

ワンセグエラーが...あるダイレクトスポット:

while(node != NULL) 
    { 
    if (strcmp(node->data,info) == 0) 
    {  
     node->counts[file]++; 
     return node; 
    } 
    node = node->next; 
} 
+0

をしたいあなた –

+0

助ける配列一度==ループは永久に実行されている間、外をgroup_length。それはなぜそこにあるのですか? – stark

答えて

0

配分といくつかの問題があります。あなたのstruct node定義では、

int counts[30]; 

を持っていますが、あなたがカウント[1999]までアクセスしているcreateHash(2000)とき。あなたはおそらく

newTable->counts = malloc(size * sizeof(int)); 

のcreateHash

int *counts; 

のようにカウントポインタを作成し、それを配分するつもりさらに、ヒープ上の割り当ては、ポインタだけではなく、構造体自体のための十分なメモリを割り当てています。たとえば、hash.cの場合struct nodeではなく、ポインタに十分なメモリを割り当てます。あなたはおそらく代わりに、無限ループの問題について

struct node * newTable = malloc(sizeof(struct node)); 

を使用したい、insertHashの最初の引数は、型struct node**のですが、struct node*を渡します。使用したい

insertHash(Map, ... 

コンパイラの警告には、それらの問題を示す必要があります。最後に、あなたのnode定義では、あなたは

struct Node *next; 

を定義していますが、コンパイル時に警告を追加

struct node *next; 
+0

ええ、私はおそらくちょうどサイズ30にする必要があります...私は実際にはちょうど30が必要なので、私は誤ってカウント用のcreateHashを作成するためにmaxファイルの代わりにいくつの文字をnumberに入れていました。だから私はちょうどint counts [30]にしておきます。ありがとうございました。構造ノード*のようなばかげたばかげたエラーで申し訳ありません。それをキャッチしませんでした。そして、insertHash(map ...)ではinsertHash(map [i]、...)ではなく、その警告を取り除いたように見えますが、書かれているのと同じように、私はそのようにしたいのですか? 私はcreateHashで行うときstruct node * newTable = maloc(sizeof(node));私はノードが宣言されていないと言うエラーを受け取ります。 – anchorman

+0

固定:struct node * newTable = malloc(sizeof(struct node)); – anchorman

+0

欠落している構造体の解も更新されました。 insertHash(Map、...、iを渡すような他の変更を加える必要があります)また、関数の宣言をinsertHash(struct node * node、...)に変更することもできます。 ]、...) –