Невалидно приложение на sizeof за завършване на структура wordcounter

Пиша програма, която отчита колко пъти се появява дума в текстов файл. Това става чрез използването на структура, която съдържа думата и броя на тази дума. Получавам компилация. Получавам грешка, която гласи:

„Невалидно приложение на sizeof към непълен тип struct wordcounter.“

Всяка информация за това как да се коригира този проблем и за моя код като цяло се оценява. Нов съм в c, така че съм отворен и за съвети, които не са свързани с този въпрос. Благодаря много. Моят код е:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

#define MAXWORDS 5000
#define MAXLINE 1000
#define MAXWORDLEN 100


int count = 0;
struct wordcount *wordPtr[MAXWORDS];

typedef struct wordcount *wordcountptr;

typedef struct wordcount {
    char word[50];
    int count;
} wordcount;


main()
{

    int wordfound = 0;
    int len;
    char line[MAXLINE];
    int printcount;

    while ((len = getline(line, MAXLINE, stdin))> 0)
    {
        int i = 0;
        int j = 0;

        for( ; i<len; i++)
        {
            if(line[i] != isalnum(line[i]) && line[i] != 32)
                line[i] = 32;
            else
                line[i] = tolower(line[i]);
        }

        for( ; j<len; j++)
        {

            char currentword[MAXWORDLEN];

            if(line[j] != 32)
            {
                for(i=0; line[j] != 32; i++)
                    currentword[i] = line[j];
            }
            if(line[j] == 32)
            {
                for(i=0;i<MAXWORDS; i++)
                {
                    if(strcmp(currentword, (*wordPtr[i]).word) == 0)
                    {
                        (*wordPtr[i]).count++;
                        wordfound = 1;
                    }
                }

                if(wordfound == 0)
                {
                    wordPtr[i] = (struct wordcounter*)malloc(sizeof(struct wordcounter));
                    strcpy((*wordPtr[i]).word, currentword);
                    (*wordPtr[i]).count = 1;
                    count++;
                }
            }
            wordfound = 0;
        }
    }

    for(printcount = 0; printcount < count; printcount++)
        printf("There are %d occurances of the word %s\n", (*wordPtr[printcount]).count, (*wordPtr[printcount]).word);

    for(printcount = 0; printcount < MAXWORDS; printcount++)
    {
        free((void*)wordPtr[printcount]);
        wordPtr[printcount]= NULL;
    }
}

person Atache    schedule 04.12.2013    source източник
comment
wordcount != wordcounter . Проверете вашето decl име спрямо името, което сте използвали в кода. Между другото има повече от един.   -  person WhozCraig    schedule 04.12.2013
comment
Неправилно ли прилагам getline? Получавам предупреждение за аргументите си. Също така сега получавам грешка по време на изпълнение: Грешка в сегментирането (ядрото е изхвърлено).   -  person Atache    schedule 04.12.2013


Отговори (1)


person    schedule
comment
Благодаря ви, това проработи. Значи проблемът е свързан с това, че не сте дефинирали екземпляра an на структурата? - person Atache; 04.12.2013
comment
Сега получавам грешка по време на изпълнение: грешка в сегментирането (ядрото е изхвърлено). Разбирам, че това е свързано с опит за достъп до памет, която не е разпределена. Правилно ли използвам getline? Получавам предупреждения за това и се чудя дали това причинява това. - person Atache; 04.12.2013
comment
ssize_t getline(char **lineptr, size_t *n, FILE *stream);това е getline прототип, първият аргумент е char **, а не char *, можете да използвате така: getline(&line, MAXLINE, stdin) - person sundq; 04.12.2013
comment
Добре. Предполагам, че съм объркан, защото си мислех, че когато се позовавате на масив в c, това е указател към първия елемент на масива. Защо трябва да посочвам адреса на линията? Предполагам, че съм объркан какво е char ** спрямо char *. Наистина оценявам помощта ти. - person Atache; 04.12.2013
comment
можете да man getline на linux, ако първият аргумент е NULL, getline сам ще разпредели паметта, така че getline трябва да знае адреса на line, за да го накара да сочи към паметта, която разпределя. - person sundq; 04.12.2013