The following program stores every word and then prints them with a number of occurrences.
Global typedef declaration:
typedef struct {
char * word;
int occ;
}
words;
words *data=NULL;
I have a problem with the search function. I’ve created a function returning int that looks like this: (max is the constantly updated size of an array of structures, that’s why I call search function after EOF is reached.)
int search(char *word,int max)
{
int i;
for(i=0; i<max; i++)
{
if(!strcmp(data[i].word,word)) return i;
}
return -1;
}
But I noticed I’m supposed to write a search function having that prototype:
struct abc *find(char *word)
So I’ve created the following code:
struct words *findword(char *word)
{
struct words *ptr;
for (ptr = data; ptr != NULL; ptr++) { /* IS THE STOP CONDITION OK? */
if (strcmp(word, ptr->word) == 0)
return ptr;
}
return NULL;
}
And I receive many errors during compilation:
reverse.c: In function ‘findword’:
reverse.c:73: warning: assignment from incompatible pointer type
reverse.c:73: error: increment of pointer to unknown structure
reverse.c:73: error: arithmetic on pointer to an incomplete type
reverse.c:74: error: dereferencing pointer to incomplete type
reverse.c: In function ‘main’:
reverse.c:171: error: ‘which’ undeclared (first use in this function)
reverse.c:171: error: (Each undeclared identifier is reported only once
reverse.c:171: error: for each function it appears in.)
make: * [reverse.o] Error 1
which is an int variable assigned to the return of my firstly written search function.
The error with which is easily fixed, but I don’t know how to replace that (solution working with my base search function):
data[which].occ++;
How to fix it so that it’ll work with my new approach to search?
EDIT
main() added:
int main(int argc, char **argv)
{
char *word;
words *temp;
int c,i,num;
/*int which;*/
FILE *infile;
if(argc!=2) {}
if((infile=fopen(argv[1],"r"))==NULL) {}
num=0;
while(1)
{
c=fgetc(infile);
if(c==EOF) break;
if(!isalpha(c)) continue;
else ungetc(c,infile);
word=getword(infile);
word=convert(word);
/*which=search(word,num);*/
if(findword(word))
{
if(!(temp=realloc(data,sizeof(words)*(num+1))))
{}
else
data=temp;
data[num].word=strdup(word);
data[num].occ=1;
num++;
}
else
data[which].occ++;
free(word);
}
sort(num-1);
for(i=0;i<num;i++)
{}
free(data);
if(fclose(infile))
{}
return 0;
}
I’ve left {} for the irrelevant pieces of code eg. error handling.
EDIT2
The things I’m asking for above, are fixed. However, I get a seg fault now.
I’ll give a link to the whole code, I don’t want to put it in an edited post since it’d create a big mess. Seg fault is caused by lines 73 and 152 (strcmp is not working somehow). Hope that full code will be easier to understand.
FULL CODE
The problems are with your findword function, lets go through all the lines
This is not what you ment to do. The
typedefyou used in defining the structure allows you to not need to writestructanymore. This is why you’re getting the error:reverse.c:73: error: increment of pointer to unknown structure. What you want is just:Next, the loop:
You may want to look up how for loops work again, the point is you’re incrementing something until it hits a condition. ptr++ will move where you’re pointing too, so you’ll no longer be pointing to your structure.
I need to see your
main()function to understand what you’re trying to accomplish, but based on the prototype you have to follow, I think the easiest solution would be something like:If this type of solution is what you’re looking to do, then you can adjust your findwords function to be very simple:
EDIT: For your new error I suspect the problem is with your memory allocation, see this short example of using your structure:
You can see here that you need to alloc some memory for the global structure then you can store data in it and pass pointers to it.
EDIT 2:
Your
main()code does this:That’s not going to work because if findword() fails it returns NULL, so in the if check ptr is set to NULL, then in the else you’re trying to deference NULL. If (and keep in mind I’m not really reading your logic so this is up to you) you really want to increment ptr->occ if a word is not found then you want this instead: