2016-09-16 13 views
1

Получение бесконечного цикла, но когда я пытаюсь «//» из двух петель, я начинаю получать FSEEK() ошибку сегм ...Infinite Loop/Сегментация ошибка

Цели файла ...: Для того, чтобы найти общий язык фразы (группировки слов) между файлами.

#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; 

}

сниппета точно, что я говорю о ...:

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 

код моего hash.c (убедитесь, что оно никогда не истекает и общественности): http://pastebin.com/Cz4R7WwK // обновление его заголовок: http://pastebin.com/ex2zARGt

Edit: Получение нового сегм ошибки после того, как последние из дополнений .. Получение ошибки сегментный с КСС часть моего insertHash в hash.c Здесь есть предупреждения в 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]; 

Первые два я могу сделать позже, но беспокоитесь о incompatile типа указателя. Как я могу решить это в этом случае?

прямое место, где ошибка сегментный это ...:

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

Добавление предупреждений при компиляции поможет вам –

+0

После == group_length SEQ внешнее в то время как цикл выполняется навсегда. Почему он там? – stark

ответ

0

Есть некоторые проблемы с ассигнованиями. В вашем struct node определения у вас есть

int counts[30]; 

но когда вы createHash(2000) вы получаете доступ к пунктам [1999]. Вы, вероятно, намерены сделать отсчитывает указатель как

int *counts; 

и передать его в createHash

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

Кроме того, ваши распределения в куче только выделения достаточно памяти для указателя, а не сама структура. Например, в hash.c

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

будет выделить достаточно памяти для указателя, а не для 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 для подсчетов. Поэтому я просто уйду со счета int [30]. Спасибо. Извините за глупые глупые ошибки, такие как узел struct * next. не поймал. И с insertHash (map ...) не вставлятьHash (map [i], ...), который, казалось, избавился от этого одного предупреждения, но с тем, как я его написал, все равно получаю то, что я хочу этим путем? когда я делаю в createHash struct node * newTable = maloc (sizeof (node)); Я получаю сообщение об ошибке: узел uneclared – anchorman

+0

Исправлено: struct node * newTable = malloc (sizeof (struct node)); – anchorman

+0

Обновлен ответ с отсутствующей структурой. Вам нужно будет внести другие изменения, чтобы сделать insertHash (Map, ... работать, например, передавать i. Вы также можете изменить объявление функции для insertHash (узел узла узла, ...), который будет обрабатывать вызов insertHash (Map [i ], ...) –