Listas Encadeadas em Linguagem C - Introdução
24 de Janeiro de 2017, 20:38 - sem comentários aindaAnteriormente, falei um pouco sobre vetores, que nada mais é que um espaço contiguo reservado na memória para armazenar elementos de um tipo especifico de variável. Entretanto, o vetor não é muito flexível, porque o desenvolvedor tem que dimensiona-lo com o número máximo de elemento que pode ser usado. Isso pode fazer com que o espaço reservado seja subutilizado ou até mesmo não ser suficiente para armazenar todos os elementos necessários.
Numa lista encadeada, para cada novo elemento inserido, alocamos um espaço de memória para armazená-lo. Entretanto, não podemos garantir que a lista encadeada será armazenada de forma contigua.
Para podermos percorrer todos os elementos de uma lista, é necessário armazenar em cada elemento, o próximo elemento da lista. A estrutura consiste numa sequência encadeada de elementos, chamada de nó da lista. O último elemento da lista aponta para NULL, sinalizando que não a mais elementos.
Para podermos exemplificar a lista em C, vamos considerar um exemplo simples, em que queremos apenas armazenar valores inteiros numa lista encadeada.
struct lista {
int info;
struct lista *prox;
};
typedef struct lista Lista;
Devemos notar que trata-se de uma estrutura auto-referenciada, pois além de armazenar o valor inteiro, ele também tem um ponteiro que apontar para a próxima estrutura do mesmo tipo e typedef struct lista Lista cria o tipo Lista que representa um nó da lista encadeada.
Nas próximas postagens eu vou explicar como usar a lista encadeada.
Matriz Alocada Dinamicamente em Linguagem C
13 de Janeiro de 2017, 20:03 - sem comentários aindaNesse artigo nós falaremos sobre matriz alocada dinamicamente. Caso você tenha alguma dificuldade, recomendo que olhe também os artigos anteriores que falam sobre ponteiros e alocação dinâmica de vetores.
Matrizes são vetores bidimensionais que são conjuntos de variáveis do mesmo tipo, com um identificador comum e alocado de forma sequencial na memória.
Declaração:
tipo_de_variavel nome[linhas][colunas];
Para alocarmos uma matriz dinamicamente é necessário declarar um vetor de linha dinamicamente e em cada posição do vetor linha, declarar um novo vetor dinamicamente que será as colunas, ou seja, um vetor dentro de outro vetor (vetor bidimensional).
Exemplo:
#include <stdio.h>
#include<stdlib.h>
int main()
{
int x, y, m=3, n=4;
float **mat;
mat = (float**) malloc(m*sizeof(float*));
for(x = 0; x<m; x++)
mat[x] = (float*) malloc(n*sizeof(float));
for(x=0; x<m; x++)
for(y=0; y<n; y++)
mat[x][y] = y;
for(x=0; x<m; x++)
{
for(y=0; y<n; y++)
printf(“%.2f\t”, mat[x][y]);
printf(“\n”);
}
return 0;
}
Pronto você criou uma matriz alocada dinamicamente.
Compilando um Kernel Personalizado
9 de Dezembro de 2016, 19:38 - sem comentários aindaOlá pessoal! Para variar um pouco, neste artigo eu irei dar uma visão geral da compilação do kernel. Este exemplo usaremos o kernel versão 4.8.12 e o nosso objetivo é atualizar o kernel que veio com a distribuição Slackware 14.1.
Atenção: Alguns dispositivos podem parar de funciona com a atualização do kernel.
Introdução
O primeiro passo para se criar um kernel é a configuração. Existem várias opções para o kernel, tais como o sistema de arquivos, SCSI, e o suporte à rede. Muitas das opções listam recursos que podem ser compilados diretamente no kernel ou compilados como módulos. Durante a configuração você vai indicando:
- Quer que o recurso seja compilado no kernel (resposta: [*] )
- Quer que o recurso seja compilado como um módulo (resposta: <m> )
- Não deseja usar o recurso (resposta: [ ] ou < >)
Algumas seleções implicam um grupo de outras seleções. Por exemplo, quando você indica que deseja incluir o suporte a SCSI, tornam-se disponíveis opções adicionais para drivers e recursos SCSI específicos. O resultados de todas essas escolhas são armazenados no arquivo de configuração do kernel, .config, que é um arquivo de texto simples que lista as opções como variáveis do shell definidas como y, m ou n, de acordo com a sua resposta para cada item.
Configuração
Primeiramente faça login como root e abaixe o kernel no site www.kernel.org e descompactá-lo com o comando:
# tar -Jxf linux-4.8.12.tar.xz
No caso, eu descompactei o arquivo na pasta /home criando assim a pasta linux-4.8.12.
Agora vamos pegar todas as configurações que já estão sendo usadas pelo kernel atual. Para isso copie o arquivo /boot/config para /home/linux-4.8.12 /.config
Dentro da pasta /home/Linux-4.8.12, carregue o menu de configuração do kernel e altere as configurações que desejar:
# make menuconfig
Após fazer todas as alterações que desejar, salve as configurações e sai do menu.
Compilando e instalando Kernel
Agora siga sequência dos comandos abaixo para compilar e instalar o kernel:
- # make dep
- # make clean
- # make bzImage
- # make modules
- # make modules_install
Nesta versão do kernel, reparei que após terminar os comandos, ele já se atualiza no /boot automaticamente.
Pronto! Já está atualizado o seu kernel.
Estrutura em Linguagem C
24 de Novembro de 2016, 18:13 - sem comentários aindaNa Linguagem C, podemos criar estruturas para agrupar um conjunto de variáveis que tenham informações comuns. Por exemplo: José nasceu no ano de 1990 e seu rg é 44777888. Neste caso as informações estariam em um cadastro de informações pessoais. Veja abaixo como seria feita uma estrutura com essas informações:
struct cadastro {
char nome[50];
int anoNasc;
int rg;
};
Desta forma, a estrutura cadastro pode ser usado como tipo de variável, conforme a declaração abaixo.
struct cadastro c;
Para poder acessar os elementos de uma estrutura, e necessário usar o operador “ponto” ( . ) e depois o nome do elemento. Veja no exemplo abaixo:
#include<stdio.h>
struct cadastro{
char nome[50];
int anoNasc;
int rg;
};
void main()
{
struct cadastro c;
printf(“Digite o nome: “);
scanf(“%s”, &c.nome);
printf(“Digite o Ano de Nascimento: “);
scanf(“%d”, &c.anoNasc);
printf(“Digite o RG: “);
scanf("%d", &c.rg);
printf(“Nome: %s\nAno: %d\nRG: %d\n”, c.nome, c.anoNasc, c.rg);
}
Pronto! Agora você já sabe criar uma estrutura.
Alocação Dinâmica de Vetores em Linguagem C
17 de Novembro de 2016, 20:47 - sem comentários aindaQuando declaramos um vetor, nós informamos o seu tamanho. Para isso temos que saber o espaço máximo que seria necessário, mas em alguns programas isso pode não ser tão fácil de prever de antemão, o que pode limitar ou gerar um consumo desnecessário de memória pelo programa. Para evitar este tipo de problema, a Linguagem C oferece a possibilidade de alocar a memória dinamicamente, ou seja, ele consegue consultar em tempo de execução qual o espaço que será necessário para o vetor.
Na biblioteca stdlib tem funções que permitem liberar e alocar memória dinamicamente. A função mais básica para alocar a memória é malloc que recebe como parâmetro o número de bytes que será necessário e retorna o endereço de memória. Voltando no assunto de ponteiros, como o comando retorna um endereço de memória, então basta atribuir o endereço para um ponteiro e depois usá-lo como vetor. Lembrando, com já foi visto em posts anteriores, que vetores são na verdade ponteiros.
Vamos ver agora um trecho de código:
int *v;
v=malloc(10*4);
Nesse trecho de código, foi criado um ponteiro e depois ele recebeu o endereço de memória com o tamanho de 10 vezes 4 bytes, ou seja, seria a mesma coisa que tivesse declarado o comando: int v[10]. Aí você pode estar se perguntando: Se 4 bytes é por causa do tamanho da variável do tipo int, então eu tenho que memorizar o tamanho de todos tipos de variáveis? A resposta é não. Para isso você tem a função sizeof() que pega o valor automaticamente para você. Então código ficaria assim:
int *v;
v = malloc(10*sizeof(int));
Agora se você quer liberar o espaço de memória, basta colocar o comando:
free(v);
Pronto! Agora você já sabe como alocar dinamicamente vetores.