Не забывайте, что в 'default
' есть 'a' - вы просто пометили этот код с помощью (неиспользуемой) метки defult
, а не дали переключателю регистр по умолчанию.
Непонятно, почему вы думаете, optopt
может быть 'c' или к нему следует обращаться особенно, когда это 'c'; это может быть похмелье из более раннего издания.
Вы обрабатываете опции 'g' и 't', как будто они принимают аргументы, но при вызове getopt()
двоеточия после них не отображаются. Если нужно верить переключателю, вам нужно, чтобы аргумент был "g:t:f:"
.
Кроме того, вы должны использовать char *
с именем optarg
вместо того, чтобы пытаться использовать argv[optind]
. Вы используете optind
после завершения цикла для обработки дополнительных ('имя файла') аргументов.
Кроме того, поскольку gravity
и thrust
являются целыми числами, вам необходимо преобразовать строки в целые числа. Самый простой способ (в значительной степени игнорируя возможные ошибки) с помощью:
gravity = atoi(optarg);
Если вы хотите выполнить обработку ошибок, вызовите функцию для проверки и создания отчетов об ошибках.
Я рекомендую ставить скобки вокруг оператора switch
или вокруг тела оператора while
:
while ((c = getopt(argc, argv, "g:f:t:")) != -1)
{
switch (c)
{
...
}
}
Это не является строго необходимым, но (IMNSHO) легче читать код с помощью дополнительных фигурных скобок. Для однострочного оператора у меня не было бы проблем; но для такого сложного утверждения, как переключатель, я рекомендую дополнительные скобки.
'return 0;
' должно быть вне цикла for
. В данный момент цикл останавливается на первом неопциональном аргументе.
Makefile в основном в порядке. В конце концов, вы будете использовать больше макросов и больше флагов предупреждения компиляции, но единственные проблемы, которые я обнаружил, что компилятор также обнаружит, это опечатка в случае по умолчанию и отсутствие преобразования строк в целые числа.
PROGRAM = lunar
SOURCE = lunar.c
HEADER = ${SOURCE:.c=.h}
OBJECT = ${SOURCE:.c=.o}
CFLAGS = -std=c99 -Wall -g
LDFLAGS =
LDLIBS = -lm
all: ${PROGRAM}
${PROGRAM}: ${OBJECT}
${CC} ${CFLAGS} -o $@ ${OBJECT} ${LDFLAGS} ${LDLIBS}
${OBJECT}: ${SOURCE} ${HEADER}
${CC} ${CFLAGS} -c ${SOURCE}
clean:
-rm -f *.o ${PROGRAM} core