Unix / C аргументы командной строки: каждая функция имеет ту же ошибку, что я делаю не так? - PullRequest
0 голосов
/ 16 февраля 2020

Я должен принимать аргументы из командной строки, чтобы создать пример программы в стиле Unix в стиле 'ls', которая перечисляет содержимое каталога.

У меня есть готовые функции, данные мне и я должен разделить код на модульный заголовок и c файлы для каждой отдельной функции и создать make-файл.

Make-файл запустится и выдаст следующие предупреждения:

-bash-3.2$ make run
gcc -c main.c
main.c: In function ‘main’:
main.c:18: warning: passing argument 1 of ‘do_ls’ from incompatible pointer type
main.c:23: warning: passing argument 1 of ‘do_ls’ from incompatible pointer type
gcc -c do_ls.c
gcc -c dostat.c
gcc -c show_file_info.c
gcc -c mode_to_letters.c
gcc -c uid_to_name.c
gcc -c gid_to_name.c
gcc -o ls3 main.o do_ls.o dostat.o show_file_info.o mode_to_letters.o uid_to_name.o gid_to_name.o
./ls3
make: *** [run] Segmentation fault
-bash-3.2$

Здесь do_ls.h для тех, кто спрашивает:

'' '

#ifndef DO_LS
#define DO_LS
                void do_ls( char*[] );


#endif

' ''

Когда я пытаюсь разобраться с ошибкой сегмента и компилирую каждый по отдельности каждый один получает эту (для меня) неоднозначную ошибку. Я вижу, что ушел где-то за пределы памяти, но как получается, что у всех них одинаковая ошибка? Это что-то с тем, как я передаю начальный указатель командной строки в main? Кто-нибудь, пожалуйста, взгляните?

Ошибки при индивидуальной компиляции:

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/ccK2dMoq.o: In function `do_ls':
do_ls.c:(.text+0x48): undefined reference to `dostat'
collect2: ld returned 1 exit status

-bash-3.2$ gcc dostat.c
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/ccMMEIb6.o: In function `dostat':
dostat.c:(.text+0x47): undefined reference to `show_file_info'
collect2: ld returned 1 exit status

-bash-3.2$ gcc gid_to_name.c
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status


-bash-3.2$ gcc main.c
main.c: In function ‘main’:
main.c:18: warning: passing argument 1 of ‘do_ls’ from incompatible pointer type
main.c:23: warning: passing argument 1 of ‘do_ls’ from incompatible pointer type
/tmp/cc8Q7153.o: In function `main':
main.c:(.text+0x1b): undefined reference to `do_ls'
main.c:(.text+0x47): undefined reference to `do_ls'
collect2: ld returned 1 exit status
-bash-3.2$ gcc mode_to_letters.c
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

-bash-3.2$ gcc show_file_info.c
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/ccQir0B8.o: In function `show_file_info':
show_file_info.c:(.text+0x1e): undefined reference to `mode_to_letters'
show_file_info.c:(.text+0x56): undefined reference to `uid_to_name'
show_file_info.c:(.text+0x74): undefined reference to `gid_to_name'
collect2: ld returned 1 exit status

Правильно ли сконструированы мои заголовки или как? Это кажется достаточно простым. Вот мое главное:

#include        <stdio.h>
#include        <sys/types.h>
#include        <dirent.h>
#include        <sys/stat.h>
#include        <string.h>
#include        <pwd.h>
#include        <grp.h>

#include        "do_ls.h"
#include        "dostat.h"
#include        "show_file_info.h"
#include        "mode_to_letters.h"
#include        "uid_to_name.h"
#include        "gid_to_name.h"



    int main(int ac, char *av[])
    {
     if ( ac == 1 )
            do_ls(".");

     else
            while ( --ac ){
                    printf("%s:\n", *++av );
                    do_ls( *av );
            }
    }

1 Ответ

0 голосов
/ 17 февраля 2020

Функция do_ls ожидает массив char *, но когда вы вызываете его, вы передаете только один char *. Это то, на что жалуется предупреждение при первоначальном вызове make. Несоответствие этого аргумента вызывает неопределенное поведение .

Попробуйте назвать его так:

if ( ac == 1 ) {
    char *args[] = { ".", NULL };
    do_ls(args);
} else {
    do_ls(av+1);
}
...