компиляция с помощью .h файла с gcc и самосортирующимся списком - PullRequest
2 голосов
/ 01 декабря 2011

У меня небольшая проблема с заданием, которое я должен закончить. Мы должны реализовать рекурсивную программу "ls", которая распечатывает "n" самые большие файлы. Но есть некоторые проблемы.

1)

У меня есть три файла: main.c, list.c и list.h. В list.h я включил string.h, stdio.h, stdlib.h, объявил struct (char * filename, long long filesize и struct element * next) и два метода (append, printlist). В list.c я включил list.h и реализовал два метода: append и printlist. В main.c я включил unistd.h, dirent.h, sys / stat.h и list.h.

Когда я пытаюсь скомпилировать его с помощью "gcc main.c", я получаю сообщение об ошибке ", использующий необъявленные методы append и printlist", но если я использую Eclipse, он прекрасно собирается. Как я могу решить это?

Точные ошибки

/tmp/ccLbHnqR.o: In function `main':
main.c:(.text+0x189): undefined reference to `printliste'
/tmp/ccLbHnqR.o: In function `ftop':
main.c:(.text+0x1f6): undefined reference to `append'

2)

Чтобы реализовать эту функциональность, я попытался использовать самосортирующийся список, т.е. проходить по списку до последнего значения, которое больше нового значения, затем установить указатель нового значения на указатель последнего значения и указатель последнего значения является новым значением.

Теоретически это должно работать, но на практике это не так.

Методы добавления выглядят так

void append(struct element **lst, char* filename, long long filesize){
    struct element *newElement;
    struct element *lst_iter = *lst;

    newElement = malloc(sizeof(*newElement)); // create new element
    newElement->filename = filename;
    newElement->filesize = filesize;
    newElement->next = NULL; // important to find the end of the list

    if ( lst_iter != NULL ) { // if elements are existing
        //if our element is bigger than the first element
        if(lst_iter->filesize < newElement->filesize){
            newElement->next = lst_iter;
            *lst = newElement;
        } else {
            while(lst_iter->next != NULL){
                if(lst_iter->filesize > newElement->filesize) lst_iter = lst_iter->next;
                else break;
            }
            newElement->next = lst_iter->next;
            lst_iter->next = newElement;
        }           
    }
    else // if the list is empty our value is the new value
    *lst=newElement;
}

Я использую этот метод из своего метода "ftop", который получает каталог, добавляет каждый файл в этом каталоге в список и для каждого каталога снова вызывает "ftop".

void ftop(char* path){
    DIR *dir;
    struct dirent *ent;

    //open the directory
    dir = opendir(path);
    if (dir != NULL) {
        //for each file/directory in it
        while ((ent = readdir(dir)) != NULL) {
            struct stat st;
            //if it is a file, append it to the list
            if(S_ISREG(st.st_mode)){
                append(&list, ent->d_name, st.st_size);
            } else {
                //if it is a directory, use recursion
                ftop(ent->d_name);
            }
        }
    }
}

Но я не понимаю, почему это не работает. Я знаю, что вы не хотите делать домашнюю работу других, но я был бы благодарен за каждый совет, который вы могли бы дать мне.

P.s .: Если вы хотите полный код

main.c list.c

1 Ответ

1 голос
/ 01 декабря 2011

Вы хотите

gcc -o main main.c list.c

, то есть - укажите оба файла.

...