Получение бесконечного цикла, но когда я пытаюсь «//» из двух петель, я начинаю получать 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;
}
Добавление предупреждений при компиляции поможет вам –
После == group_length SEQ внешнее в то время как цикл выполняется навсегда. Почему он там? – stark