2013-09-01 2 views
0

Я пытаюсь взять данную программу и превратить ее в функцию (чтобы я мог ее модифицировать для рекурсивного вызова). Исходное задание предназначено для обхода каталога (сначала по глубине). Это только для того, чтобы помочь мне начать.Как изменить программу на C, чтобы превратить ее в функцию

Исходная программа:

#include <dirent.h> 
#include <errno.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) { 
    struct dirent *direntp; 
    DIR *dirp; 

    if (argc != 2) { 
     fprintf(stderr, "Usage: %s directory_name\n", argv[0]); 
     return 1; 
    } 

    if ((dirp = opendir(argv[1])) == NULL) { 
     perror ("Failed to open directory"); 
     return 1; 
    } 

    while ((direntp = readdir(dirp)) != NULL) 
     printf("%s\n", direntp->d_name); 

    while ((closedir(dirp) == -1) && (errno == EINTR)) ; 

    return 0; 
} 

Эта программа работает отлично. Но когда я превращаю его в функцию, я получаю сообщение об ошибке. Я считаю, что он должен делать с пропусканием

char *argv[] 

Вот код, я пытался сделать так далеко, main.c:

#include <dirent.h> 
#include <errno.h> 
#include <stdio.h> 

int shownames(char *argv[]); 

int main(int argc, char *argv[]) { 
    struct dirent *direntp; 
    DIR *dirp; 

    if (argc !=2) { 
     fprintf(stderr, "Usage: %s directory_name\n", argv[0]); 
     return 1; 
    } 

    shownames(*argv[]); 

    return 0; 
} 

и shownames.c:

#include <dirent.h> 
#include <errno.h> 
#include <stdio.h> 

int shownames(char *argv[]) { 
    struct dirent *direntp; 
    DIR *dirp; 

    if ((dirp = opendir(argv[1])) == NULL) { 
     perror ("Failed to open directory"); 
     return 1; 
    } 

    while ((direntp = readdir (dirp)) != NULL) 
     printf("%s\n", direntp->d_name); 

    while ((closedir(dirp) == -1) && (errno == EINTR)) ; 

    return 0; 
} 

Я знаю, что это, вероятно, довольно простая ошибка, я просто не могу понять, что я делаю неправильно. Любая помощь была бы весьма признательна. Благодаря!

+2

Не могли бы вы выставить сообщение об ошибке? –

+3

Вызовите 'показанные имена (argv)' из вашего нового 'main', а не' namesames (* argv []) '. Первый - это вызов. Последнее частично относится к тому, как выглядит объявление, и это недействительный синтаксис для вызова. – lurker

ответ

0

Вы получаете ошибку компилятора? потому что, как говорит mbratch, shownames(*argv[]); недопустим синтаксис; в частности, пустые квадратные скобки [] предназначены для объявления массива неизвестной длины, а не для использования массива. попробуйте просто:

shownames(argv);

также, вы не обращая внимания на возвращаемое значение shownames. вы можете исправить:

return shownames(argv); 

 Смежные вопросы

  • Нет связанных вопросов^_^