Enviado em 01/05/2018 - 22:03h
Criei um gerenciador de lista (fila) em C que oferece suporte a estruturas de dados desconhecidas, as quais são definidas pelo programador durante o desenvolvimento. Internamente, a fila usa o tipo void* para armazenar o conteúdo da estrutura que, por sua vez, é armazenada dentro de cada struct Node. Já implementei algumas funções básicas como add(), del(), get(), first() e last().
/* Estrutura definida pelo programador. */
struct Pessoa {
char nome[11];
int idade;
char sexo;
float altura;
};
/* Eis aqui o problemão!
O programador precisará definir os offsets de cada campo
para poder usar a fila. */
#define OFF_NOME 0
#define OFF_IDADE 11
#define OFF_SEXO OFF_IDADE+sizeof(int)
#define OFF_ALTURA sizeof(struct Pessoa)-sizeof(float)
int main() {
struct Node *fila = 0;
struct Pessoa pessoa;
// cria a fila passando o tamanho da estrutura
fila = fila_init(sizeof(struct Pessoa));
if(!fila)
{
puts("Erro na criação da fila!");
return -1;
}
// adiciona o primeiro nó
strncpy(pessoa.nome, "Ana", sizeof(pessoa.nome)-1);
pessoa.idade = 5;
fila_adiciona(fila, (void*)&pessoa);
// escreve novos valores no nó que se encontra no índice 0
fila_set_str (fila, 0, "Amanda", 10, OFF_NOME);
fila_set_int (fila, 0, 50, OFF_IDADE);
//....
return 0;
}
/* Estrutura Node usada internamente pelo gerenciador */
struct Node {
void *st;
int st_size;
struct Node *prox;
};
int fila_set_str(struct Node *fila, int index, const char *s, int maxlen, int campo_offset)
{
unsigned char *pbST;
char *pChar;
pbST = (unsigned char*)fila_get(fila, index);
if(pbST)
{
pChar = (char*)(pbST+campo_offset);
strncpy(pChar, s, maxlen);
}
}
void fila_set_int(struct Node *fila, int index, int valor, int campo_offset)
{
unsigned char *pbST;
int *pInt;
pbST = (unsigned char*)fila_get(fila, index);
if(pbST)
{
pInt = (int*)(pbST+campo_offset);
*pInt = valor;
}
}
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Vou voltar moderar conteúdos de Dicas e Artigos (1)
SysAdmin ou DevOps: Qual curso inicial pra essa área? (3)
É cada coisa que me aparece! - não é só 3% (3)
Melhorando a precisão de valores flutuantes em python[AJUDA] (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta