Tip:
Highlight text to annotate it
X
Inicialmente vamos ver se o compilador C/C++ está instalado no sistema.
Abriremos uma tela de console e usaremos a linha de comando.
Por hora, não usaremos nenhuma IDE (Integrated Development Environment). Apenas o console e um editor simples como o gedit.
O compilador cc está presente.
No comando "cc -v", o -v diz ao compilador pra mostrar algumas informações como a versão.
gcc, que é o compilador C GNU, também está presente. É uma versão para processadores da linha x84 de 64 bits.
Sua versão é a 4.4.6. Provavelmente é a mais recente.
Testando o compilador g++ g++ é o compilador GNU para C++.
pwd é um comando para mostrar o diretório (pasta) no qual se encontra.
Criarei uma pasta no Desktop para usarmos como área de desenvolvimento.
O comando cd (change directory) muda de diretório. Irei para o diretório /home/sandro/Desktop.
No comando "cd .." os .. indicam o diretório imediatamente superior. Serve para voltar na árvore de diretórios.
"ls" serve para listar o conteúdo de um diretório. Repare que nesse caso alguns links especiais no Desktop não foram listados pelo "ls" ".
"-al" diz ao "ls" para listar tudo ("a de all) na forma de lista ("l). Só há o "." que é o um apelido do diretório local e o ".." que é um apelido para o diretório imediatamente superior.
Criando então o diretório "myproject" no diretório "Desktop".
Entrando no diretório de desenvolvimento ...
Demonstração de que "." aponta para o diretório local.
"touch" cria um arquivo qualquer. Criarei um arquivo que servirá como arquivo fonte para nosso primeiro programa.
A extensão ".c" é para deixar claro que esse arquivo é de um código fonte em C. Editaremos o arquivo com o gedit.
Veja que o comando "gedit myprog.c" deixa o console "ocupado".
Ao por o caracter "&" ao final do comando, o comando é executado e o console permanece disponível.
O menor programa possível em C. A função main() é o ponto de entrada do programa em C. É onde o programa começa a executar. Dentro das chaves é onde colocamos nosso código. Nesse caso não há nenhum.
Compilando o código para gerar o executável pelo sistema.
Esse comando compila o fonte e o executável é posto no arquivo "a.out".
Para executar o programa é só dar o comando "./a.out". Veja que é necessário informar ao sistema que o programa "a.out" está no diretório local "./"
Não há nada na saída pois não há nenhum código dentro das chaves.
Vamos fazer mais alguma coisa nesse código fonte ...
printf é uma função da linguagem C que serve como saída. Nesse caso escreveremos uma saudação na tela (saída padrão).
Isso não é um erro é uma advertência. O compilador incluiu de forma implícita um biblioteca necessária para o uso de printf: "stdio.h".
O programa funciona mesmo assim.
Veja que após a saída o sistema escreve o "prompt" na mesma linha.
O caracter especial "\\n" fará o sistema passar para a próxima linha após escrever o texto de saudação.
Agora o texto é mostrado em uma linha e o prompt em outra.
Faremos a inclusão do arquivo de cabeçalho para informar ao compilador em qual biblioteca ele deve procurar pela função "printf". Assim aquela advertência não aparecerá.
Ops! Escrevi errado o nome da include. Vamos corrigir.
É boa prática ter o valor de retorno da função main(). Caso o programa cheque ao final sem erro, retorna-se "0" para o sistema operacional para informá-lo que o programa terminou corretamente.
Acho que o compilador deveria ter "reclamado" que nosso main() está sem retorno. Vamos incluir o retorno.
Havia me esquecido de dizer que os caractere // são para informar o compilador que o que vem depois até o fim da linha é para ser desconsiderado.
Da mesma forma, tudo que estiver dentro de /* */ é comentário e não é considerado pelo compilador.
A função main() pode ter dois parâmetros. O primeiro é o número de argumentos na linha de comando (incluido o nome do programa) e o segundo é um arranjo com os strings.
Os parâmetros devem ser separados por vírgula.
O segundo parâmetro é um ponteiro para ponteiros. Isso não será abordado nesse momento.
Vamos testar o uso do primeiro parâmetro.
"%d é para dizer a função "printf para tratar o parâmentro "argc" como um número inteiro.
Isso vai imprimir o número de argumentos digitados na linha de comando.
Apenas 1, o próprio nome do programa digitado.
Se digitarmos mais alguma coisa como argumento para o programa, então teremos nesse caso 4 argumentos. O programa mais os 3 argumentos do programa.
Outro "printf para imprimir o nome do programa. Veja que agora usamos "%s" para informar a função que o que queremos imprimir é um string.
Os arranjos em C são indexados à partir do índice 0. Então "argv[0] refere-se ao primeiro elemento da matriz que é o nome do programa.
Veja então o "./a.out" como sendo o primeiro elemento da matriz.
Imprimiremos o segundo argumento do comando (primeiro argumento do programa). O segundo elemento tem índice 1.
Como esperado, "arg1" é o segundo argumento.
Só como curiosidade, "**argv também pode ser declarado como "*argv[]". Mas isso é assunto para um outro tutorial sobre ponteiros.
Coisa muito comum e útil é separar o código em múltiplas unidades para maior clareza.
Vamos criar uma função para ilustrar isso.
Uma função tem tipo de retorno (int nesse caso) ou não (void). Tem um nome (nesse caso myAddFunc).
Pode também ter ou não parâmetros. Nesse caso teremos dois inteiros x e y.
No corpo da função, delimitado pelos parênteses, colocamos nosso código.
Criamos uma varíavel temporária chamada temp para receber a soma dos valores x e y.
Então retornamos o resultado com a palavra reservada da linguagem C chamada "return".
Agora usaremos a função dentro do corpo da função principal.
Criarei duas váriáveis a e b e as inicializarei com valores quaisquer.
Criarei uma terceira variável para receber o resultado calculado pela função.
Então imprimiremos para ver se o programa está funcionando direito.
Veja que como os 3 valores são inteiros, então só usamos "%d".
Ok! Funcionou!
Vamos simplificar um pouco o código.
A soma pode ser posta diretamente no retorno.
Mas NAO DEIXE aquelas duas vírgulas como eu deixei!!! ;-)
Aqui também não há necessidade de uma terceira variável. A função pode ficar aninhada dentro de outra função.
As funções podem ficar após a função principal.
Nesse caso, deve-se por o protótipo da função antes da função principal para que o compilador saiba sobre ela quando ele encontrá-la dentro do corpo da main().
O compilador não reclamou. Provavelmente porque se trata de uma versão mais recente.
Mesmo assim, vamos inserir o protótipo da função antes do main().
Agora está correto.
Vamos obter do usuário os valores a serem somados a e b.
Imprimiremos uma mensagem para o usuário para ele saber o que fazer.
Usaremos a função "scanf da biblioteca "stdio.h" para obter um valor do teclado.
Novamente, "%d" refere-se a um inteiro e "&a" refere-se ao endereço da variável "a" onde a função "scanf" deve colocar o valor lido do teclado.
Faremos o mesmo para "b".
Inserindo "quebra de linha".
Não ficou legal. Acho que foram os "\\n". Caso seja necessário interromper o programa pela "força bruta", digite CTRL-C.
Agora está ok.
Vamos mudar um pouco. Vamos fazer uma das variáveis ser do tipo float (não inteiro).
Faremos "b" ser "float. Veja que em "scanf temos que mudar de "%d" para "%f".
Ops! Viram que havia duas vírgulas aqui? rsrsrs.
Temos de mudar o tipo de retorno de "int" para "float, já que a soma de um "int" com um "float" é "float".
O protótipo da função também deve mudar para ficar compatível com sua implementação.
Como o resultado da função é float, então scanf também deve ser mudada de acordo.
Há alguns erros aqui. Vejamos ...
Um deles é esse. Declaração de "b" está incorreta.
Compilou, mas ainda há erro!!! A formatação de saída do segundo valor está incorreta (%d).
Mudando de "%d" para "%f" já que "b" é "float".
Ainda há erros! O segundo parâmetro de myAddFunc deve ser mudado para float.
Mudarei a formatação novamente para imprimir apenas dois dígitos após a vírgula.
Veja que a soma deveria ser 7.46. Devemos mudar o tipo do segundo parâmetro da função de "int" para "float".
Corrigindo ...
Agora sim.
O comando rm (remove) apaga arquivos.
"gcc myprog.c" compila e faz linkedição" ao mesmo tempo gerando diretamente o executável.
O comando "gcc -c myprog.c" compila mas não faz linkedição e não gera o executável.
Ele gera o código objeto (myprog.o) que pode ser usado em outro programa.
A opção "-o" informa o compilador o nome do arquivo de saída.
Nesse caso, "myExecutableProgram". Ele é diretamente executável pois ele tem a função main() e foi compilado sem a opção "-c".
Agora dividiremos o código em arquivos diferentes. Vamos por a função em outro arquivo.
Criando o arquivo onde colocaremos nossa função.
Abrindo para edição ...
Copiando o código ...
Vamos tentar compilar a função separadamente. Como no arquivo da função não há main(), então deveremos usar a opção "-c".
Veja o código objeto compilado "myAddFunc.o".
Agora estamos compilando "myprog.c", linkeditado ele com "myAddFunc.o" e colocando o resultado em "***".
Veja o programa executável "***".
Mas há um erro.
Lembra-se que eu disse que deve haver antes da função main() o protótipo da função a ser usada?
myAddFunc.c já foi compilada, portanto não é mais necessário compilá-la.
Funcionou!
Dividiremos o código ainda mais. Criaremos um arquivo de cabeçalho para a nossa função.
Aquele protótipo de função antes do main() vai para o arquivo de cabeçalho.
O código fica dentro dessas definições.
Podermos retirar o protótipo de função.
Para compensar, colocaremos uma "include" para incluir aqui o arquivo de cabeçalho.
Recompilando e linkeditando o programa principal (que possui o main()).
Erro! Provavelmente algo errado no arquivo de cabeçalho.
Por isso é bom ter um editor com as linhas numeradas. O erro está na linha 7. Deve ser a do #include "myAddFunc.h".
_MYADDFUNC_H_ não foi definida!!!
Compilando a função.
Compilando o programa principal e linkeditando com o código compilado da função.
Esse tutorial priorizou a linguagem C e a organização do código assim como algumas outras coisas como entrada e saída, parâmetros da função main() e o uso bem básico de ponteiro (**argv).
Na próxima parte veremos sobre struct que é a porta de entrada para começarmos a ver C++