Linguagem C: Bibliotecas próprias

Fala galera!

Neste artigo de hoje, quero abordar um tópico já “rodado”: Funções e Procedimentos. Mas dessa vez, para criar suas próprias bibliotecas.

Quando aprendemos a programar, primeiro nos ensinam a criar um programinha gigantesco, indo da forma estruturada mais mal estruturada possível: De cima pra baixo, esquerda pra direita até o return 0.

Depois, vem com aquele mesmo papinho de “lembram que main é uma função? Vamos criar a nossa agora!”.

Você vai todo feliz e cria seu void soma(int a, int b). Depois faz um int soma(…) e assim por diante.

Uma coisa que não me ensinaram é como criar funções externas. Tudo que fiz, sempre foi no mesmo arquivo. Mesmo que eu precisasse usá-la umas 500 vezes pelos exercícios, tinha que ir lá e dar CTRL+C e CTRL+V no código.

Se achasse um erro na função, era a hora de pular da ponte, pois estava em vários arquivos.

Começar do Começo

Como sempre, estou usando meu fiel Sanguinolento DevC++. Abra-o e aponte para Arquivo -> Novo Projeto. Configure-o da seguinte maneira:


De um OK e ele vai pedir para salvar o projeto. Salve-o e em seguida aperte CTRL+S para salvar o arquivo fonte.

Quando precisar mexer no projeto, basta abrir o arquivo do projeto que você salvou, não abra diretamente o fonte.

Vamos fazer um programa simples, um ‘repetidor’ de frases. Do que precisamos, a princípio?

  • Uma variável para armazenar a frase
  • Uma variável para armazenar quantas vezes repetiremos
  • Laço de repetição
  • Conhecimentos avançados em printf :P

O primeiro item está em negrito pois pode confundir a cabeça do pessoal. Afinal, como armazeno uma frase em c?

Uma frase nada mais é que um array(vetor) de char.

“Oi! Eu sou Goku!”
=
‘O’ ‘i’ ‘!’ ‘E’ ‘u’ ‘ ‘ ‘s’ […]

Então, usaremos um array de char ;)

Hora de codificar!

<span style="color: #000000;">
<pre>#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  char Frase[100];
  int QtdRepeticao,i;

  printf("Digite uma frase:\n");
  //não entendeu esse scanf?
  //continue lendo o artigo...
  scanf("%100[^\n]",Frase);

  printf("Deseja repetir quantas vezes? ");
  scanf("%d",&QtdRepeticao);

  for(i=0; i < QtdRepeticao; i++)
  {
      printf("\n\n%s (%d)",Frase,i+1);
  }

  printf("\n\nUfa, cansei!\n");

  system("PAUSE");
  return 0;
}

Viu que encanado o nosso scanf? E nem usa o & !! Como pode?

Vocês sabiam que o scanf aceita especificadores de formato. Porém, ele também aceita expressões regulares. Quando você usa o %d, prepara o scanf para ler um número inteiro.

Quando usa [^\n], prepara o scanf para ler qualquer coisa, exceto uma linha nova, que é criada pelo pressionar do enter.

Podemos traduzir para [not NewLine] = Enquanto não tiver uma quebra de linha.

O 100 antes dos colchetes indica que só vamos ler 100 caracteres, independente do usuário digitar 1500 ou 27.

Por que não usa &?

Estamos brincando com um array de char. Quando passamos um array sem os [], estamos passando o endereço de memória dele. Quando você usa o &, você passa o endereço de memória da variável. Portanto, passar um array e usar o & fazem 6 e meia dúzia ao mesmo tempo.

Hora de funcionar!

O programa já funciona, mas vamos passar para um lindo procedimento.

Quando vamos criar funções/procedimentos, geralmente fazemos o trecho de código no próprio programa principal, depois deixamos de uma forma genérica.

Nossa função precisa do que para funcionar?

  • Precisamos saber o texto
  • Precisamos saber a quantidade de repetições

Para tanto, impomos os parâmetros de nossa função. Sem eles, nada feito, a função vai pipocar um erro.

void Papagaio(char FraseRepetir[], int Quantidade);

Esse é o protótipo de nossa função. Com esses dados, é possível imprimir a frase uma determinada quantidade de vezes.

#include <stdio.h>
#include <stdlib.h>

//o protótipo fica ANTES do main
void Papagaio(char FraseRepetir[], int Quantidade);

int main(int argc, char *argv[])
{
  char Frase[100];
  int QtdRepeticao;

  printf("Digite uma frase:\n");
  //não entendeu esse scanf?
  //continue lendo o artigo...
  scanf("%100[^\n]",Frase);

  printf("Deseja repetir quantas vezes? ");
  scanf("%d",&QtdRepeticao);

  //chamada da função
  Papagaio(Frase,QtdRepeticao);

  printf("\n\nUfa, cansei!\n");

  system("PAUSE");
  return 0;
}

//aqui está o nosso procedimento
void Papagaio(char FraseRepetir[], int Quantidade)
{
  //precisei declarar a variável i
  int i;

  for(i=0; i < Quantidade; i++)
  {
      printf("\n\n%s (%d)",FraseRepetir,i+1);
  }
}

Preste atenção, praticamente demos um RECORTAR/COLAR no for e substituímos pela chamada de função, mas precisamos mudar o nome das variáveis pelas que existem na função. Frase virou FraseRepetir, durante a função.

Mas ainda pode melhorar.

MyLibrary.h

Clique em arquivo, escolha novo e Arquivo Fonte. Vai surgir uma pergunta “Deseja adicionar nova unidade ao projeto atual?”. Escolha sim.

Pressione ctrl+s para salvar o arquivo, mas preste atenção:

Escolha “Salvar como tipo: HEADER FILES. Nomeie o arquivo de MyLibrary. Perceba que na aba projeto (exibir, navegador de classes/projetos) surgiu o MyLibrary.h. Cosa linda.

Você pode alternar pelos arquivos. Vá para o main.c (ou como você chamou o primeiro arquivo do projeto) e copie tanto o protótipo como a função para o MyLibrary:

Fonte do MyLibrary

void Papagaio(char FraseRepetir[], int Quantidade);

void Papagaio(char FraseRepetir[], int Quantidade)
{
  //precisei declarar a variável i
  int i;

  for(i=0; i < Quantidade; i++)
  {
      printf("\n\n%s (%d)",FraseRepetir,i+1);
  }
}

Fonte do main.c

#include <stdio.h>
#include <stdlib.h>
//incluo a minha biblioteca
#include "MyLibrary.h"

int main(int argc, char *argv[])
{
  char Frase[100];
  int QtdRepeticao;

  printf("Digite uma frase:\n");
  //não entendeu esse scanf?
  //continue lendo o artigo...
  scanf("%100[^\n]",Frase);

  printf("Deseja repetir quantas vezes? ");
  scanf("%d",&QtdRepeticao);

  //chamo a função normalmente
  Papagaio(Frase,QtdRepeticao);

  printf("\n\nUfa, cansei!\n");

  system("PAUSE");
  return 0;
}

Veja bem os includes que fizemos no main.c. Acrescentamos a biblioteca que acabamos de criar! O fonte do main.c está bem mais limpo e claro. Se você precisar ir rapidamente até a definição de Papagio, basta segurar CTRL e dar um clique sob o seu nome.

Notas

Nesse arquivo MyLibrary.h, podemos criar constantes, fazer outros includes e tudo mais que temos direito.

Para um melhor funcionamento de seu programa, recomendo que você adote o CTRL+F11 (executar, recompilar tudo) e CTRL+F10 (executar, executar).

O F9 tem a mania de não pegar as atualizações que você faz nas bibliotecas.

Passando a régua e fechando a conta

Esse método me ajudou para caramba ao realizar alguns exercícios desse ano. Criei uma library “DonahLibrary.h” e fiz uso constante dela.

Espero que possa ser útil para outros programadores que ainda não sabiam criar suas próprias bibliotecas.

Bônus:

Link para o projeto que criamos ao longo do artigo.

Link para a DonahLibrary.h

É necessário esperar a página carregar e, a cima do ícone da pasta/folha branca, existe um link BAIXAR. Basta clicar nele.

Anúncios

5 pensamentos sobre “Linguagem C: Bibliotecas próprias

  1. mto bom, mas ainda deixou meio vago, poderia ser mais especifico quanto ao arkivo .h?
    por exemplo, ter uma funcao num arkivo .c e usar somente as assinaturas no .h para chamar ela em uma main de outro arkivo…eh possivel?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s