Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Próxima revisão | Revisão anterior | ||
c:a_funcao_main [2023/08/01 18:09] – criada maziero | c:a_funcao_main [2023/08/15 14:55] (atual) – maziero | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== A função main ====== | ||
+ | |||
+ | {{ progc_funcao_main.mkv |Video desta aula}} | ||
+ | |||
+ | {{ main.png? | ||
+ | |||
+ | ===== Protótipos ===== | ||
+ | |||
+ | O protótipo da função '' | ||
+ | |||
+ | <code c> | ||
+ | // padrão C ANSI | ||
+ | int main (void) ; | ||
+ | int main (int argc, char **argv) ; | ||
+ | int main (int argc, char *argv[]) ; | ||
+ | |||
+ | // sistemas UNIX-like (Linux, FreeBSD, Solaris, ...) e Windows | ||
+ | int main (int argc, char **argv, char **envp) ; | ||
+ | |||
+ | // sistemas Apple (MacOS, iOS) | ||
+ | int main (int argc, char **argv, char **envp, char **apple) ; | ||
+ | </ | ||
+ | |||
+ | ===== Argumentos da linha de comando ===== | ||
+ | |||
+ | Significado dos parâmetros usuais: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | O código a seguir imprime na tela os argumentos usados no lançamento do programa: | ||
+ | |||
+ | <code c argv.c> | ||
+ | #include < | ||
+ | |||
+ | int main (int argc, char **argv, char **envp) | ||
+ | { | ||
+ | int i ; | ||
+ | |||
+ | printf (" | ||
+ | |||
+ | for (i = 0; i < argc; i++) | ||
+ | printf (" | ||
+ | |||
+ | return (0) ; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Um exemplo de compilação e execução do código acima: | ||
+ | |||
+ | $ gcc argv.c -o argv -Wall | ||
+ | | ||
+ | $ ./argv teste 1 2 3 --help | ||
+ | Numero de argumentos: 6 | ||
+ | argv[0]: ./argv | ||
+ | argv[1]: teste | ||
+ | argv[2]: 1 | ||
+ | argv[3]: 2 | ||
+ | argv[4]: 3 | ||
+ | argv[5]: --help | ||
+ | |||
+ | ===== Funções específicas ===== | ||
+ | |||
+ | Para ler e tratar mais facilmente as opções da linha de comando informadas por // | ||
+ | |||
+ | Eis um exemplo de uso da função '' | ||
+ | |||
+ | <code c options.c> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main (int argc, char **argv) | ||
+ | { | ||
+ | int flag_a = 0; | ||
+ | int flag_b = 0; | ||
+ | char *value_c = NULL; | ||
+ | int option; | ||
+ | |||
+ | opterr = 0; | ||
+ | |||
+ | // options: | ||
+ | while ((option = getopt (argc, argv, " | ||
+ | switch (option) | ||
+ | { | ||
+ | case ' | ||
+ | flag_a = 1; | ||
+ | break; | ||
+ | case ' | ||
+ | flag_b = 1; | ||
+ | break; | ||
+ | case ' | ||
+ | value_c = optarg; | ||
+ | break; | ||
+ | | ||
+ | fprintf (stderr, " | ||
+ | exit (1) ; | ||
+ | } | ||
+ | |||
+ | printf (" | ||
+ | flag_a, flag_b, value_c); | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Status de saída ===== | ||
+ | |||
+ | Outro canal de interação importante entre o programa C e o sistema operacional é o valor de retorno da função '' | ||
+ | |||
+ | <code c retval.c> | ||
+ | #include < | ||
+ | |||
+ | int main (int argc, char **argv, char **envp) | ||
+ | { | ||
+ | return (14) ; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | O //status// de saída de um processo pode ser consultado no terminal UNIX (shell Bash) através da variavel '' | ||
+ | |||
+ | < | ||
+ | $ gcc retval.c -o retval -Wall | ||
+ | $ ./retval | ||
+ | $ echo $? | ||
+ | 14 | ||
+ | </ | ||
+ | |||
+ | O status de saída também pode ser usado em scripts do shell: | ||
+ | |||
+ | <code sh testa-retorno.sh> | ||
+ | #!/bin/sh | ||
+ | |||
+ | if retval | ||
+ | then | ||
+ | # exit status is zero | ||
+ | echo " | ||
+ | else | ||
+ | # exit status is NOT zero | ||
+ | echo " | ||
+ | fi | ||
+ | </ | ||
+ | |||
+ | ===== Exercícios ===== | ||
+ | |||
+ | - Escrever um programa que recebe uma lista de parâmetros na linha de comando. Ele não escreve nada na saída, mas devolve como //status// de saída o número de parâmetros que iniciam com o caractere "'' | ||
+ | - Escrever um programa '' | ||
+ | - Escrever um programa para listar as variáveis de ambiente recebidas pelo programa (parâmetro '' | ||