Ir para o conteúdo
Alcap

Numero sequencial unico

Mensagens Recomendadas

Alcap

Boas,

Precisava de atribuir um numero de identificaçao em algumas estruturas de um programa que estou a desenvolver, mas nao me recordo agora da maneira de garantir que o numero é de facto unico e sequencial.

Por exemplo:

Tenho um array de estruturas do tipo funcionario, sempre que adicionar mais um funcionario, tenho que lhe atribuir um codigo de identificação unico a todos os funcionarios.

Alguem me sabe ajudar? Isto é C basico, ou seja, nao é necessario trabalhar com diferentes processos, mutexes ou coisas do genero... Só tenho que garantir que o numero é unico e sequencial para aquela execuçao. Neste momento tenho uma variavel global com um codigo e vou incrementando, mas isso da azo a que se alguem for mexer no codigo, manipule essa variavel numa funçao qualquer e mexa com o funcionamento correcto do programa.

Desde ja agradecido,

Alcap

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

Podes usar uma variavel estatica dentro da estrutura.

struct func
{
 static int skCount;
 //...
};

//inicializar a variavel a 78
int func::skCount = 78;

Tens que perceber que uma variavel estatica porta-se muito similar a uma variavel global.

Ja' agora sei que isto em C++ funciona, em C ja' estou enferrujado e nao me lembro bem se isto funciona, mas em principio sim.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
typedef struct Lista
{
 Elemento * lista;        // lista com os elementos
 unsigned int quantidade; // número de elementos guardados
 unsigned int proximo_id; // próxiom número identificador a ser atribuido a um elemento registado
} Lista


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Alcap

Podes usar uma variavel estatica dentro da estrutura.

struct func
{
 static int skCount;
 //...
};

//inicializar a variavel a 78
int func::skCount = 78;

Tens que perceber que uma variavel estatica porta-se muito similar a uma variavel global.

Ja' agora sei que isto em C++ funciona, em C ja' estou enferrujado e nao me lembro bem se isto funciona, mas em principio sim.

Nao posso alterar as estruturas...

EDIT: E tambem nao posso usar a tua soluçao HappyHippyHippo... Isto é para um trabalho basico que estou a ajudar um amigo meu a fazer, é para a primeira cadeira de programaçao do curso dele e tenho que me restringir ao basico dos basicos. Nao ha nada mais simples?

Desde já agradecido

Editado por Alcap

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Nao posso alterar as estruturas...

não existem milagres

queres alterar sem poder alterar ... isso parece impossível ...

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Alcap

não existem milagres

queres alterar sem poder alterar ... isso parece impossível ...

Eu posso alterar os valores dos membros das estruturas, nao posso é tocar na sua declaraçao!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

Como e' que crias um funcionario?


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Happening

Se o número do funcionario está numa struct, para guardares os dados deves ter uma lista ou não?

Se sim podes criar uma função para garantir que o número nunca é igual e lanças um rand po numero

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Alcap

Como e' que crias um funcionario?

Tenho uma funçao que le o input dos diferentes campos a partir do teclado e o insere logo no array. O input lido é só dos campos que o utilizador consegue preencher, campos como o do ID nao sao pedidos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Se queres garantir que não há o mesmo ID, tens de percorrer todos os elementos já criados e verificar se o ID gerado aleatoriamente já foi gerado antes. Isto supondo que tal ID é gerado aleatoriamente, foi o que eu percebi.

Tens é de te explicar melhor quando te referes ao facto de não poderes alterar as estruturas ou não tocar na sua declaração... não entendi muito bem o que queres dizer exactamente.

Tenho uma funçao que le o input dos diferentes campos a partir do teclado e o insere logo no array. O input lido é só dos campos que o utilizador consegue preencher, campos como o do ID nao sao pedidos

Uma ajuda preciosa para o problema em debate, obrigado...

Editado por thoga31
  • Voto 1

Knowledge is free!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

Tenho uma funçao que le o input dos diferentes campos a partir do teclado e o insere logo no array. O input lido é só dos campos que o utilizador consegue preencher, campos como o do ID nao sao pedidos

Mas ao menos podes mudar essa funcao ou nao??

Se queres garantir que não há o mesmo ID, tens de percorrer todos os elementos já criados e verificar se o ID gerado aleatoriamente já foi gerado antes. Isto supondo que tal ID é gerado aleatoriamente, foi o que eu percebi.

Penso que nao, no inicio do post ele diz:

Boas,

Precisava de atribuir um numero de identificaçao em algumas estruturas de um programa que estou a desenvolver, mas nao me recordo agora da maneira de garantir que o numero é de facto unico e sequencial.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Penso que nao, no inicio do post ele diz:

(...) garantir que o numero é de facto unico e sequencial.

Há sempre a probabilidade de um número gerado aleatoriamente se repetir. A escala de tal probabilidade depende 1) do intervalo do número a ser gerado, 2) do nº de casas decimais admitidas e 3) do nº de vezes que é "pedido" um nº aleatório.

Pelo que essa frase não esclarece se o ID é ou não é aleatório. ;)

Basicamente anda-se aqui quase a mandar tiros no escuro sem se saber se há uma Struct definida que deve ser utilizada ou se pode ser ele a construí-la, se o ID é aleatório ou não, se pode utilizar este ou aquele método... Anda-se a fazer perguntas retóricas.

Editado por thoga31

Knowledge is free!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

Há sempre a probabilidade de um número gerado aleatoriamente se repetir. A escala de tal probabilidade depende 1) do intervalo do número a ser gerado, 2) do nº de casas decimais admitidas e 3) do nº de vezes que é "pedido" um nº aleatório.

Pelo que essa frase não esclarece se o ID é ou não é aleatório. ;)

Se e' sequencial penso que gerar aleatoriamente nao sera' a melhor forma :D a menos que o 1o ID seja aleatorio ;)


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Se e' sequencial penso que gerar aleatoriamente nao sera' a melhor forma :D a menos que o 1o ID seja aleatorio ;)

Começas no 10000, e a partir daí é somar um... voltamos à questão: se é sequencial e tal, então onde está o problema da repetição de ID's? Para haver repetição, 1) ou é introduzido pelo utilizador, ou 2) é gerado aleatoriamente. Caso contrário, os ID's terão de partir de um ID inicial, e como referiste esse pode ser aleatório.

Mas volto a frisar que estamos a dar tiros no escuro. Se tivéssemos mais intel com que basear os nossos conselhos, seria bom. Já reparaste que estamos aqui a tentar espremer informação há 13 posts e que aquilo que conseguimos obter levou-nos tão-somente a entrar no mundo da adivinhação?...

Editado por thoga31

Knowledge is free!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

pois ele foi um pouco contraditorio.

Epa eu estou a estudar para ser bruxo, eu considero isto um treino :D


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Alcap

Bem, eu acho é que o objectivo passa por aquilo que o thoga31 disse (percorrer o array e ver se ja existe aquele numero)... De outra forma nao faz sentido. O objectivo é o ID ser sequencial, ou seja, começa no 1 e vai incrementando por ai fora. Como é inserido pelo programa, estava a tentar encontrar uma forma de proteger o codigo do programador. Ou seja, se alguem se lembrasse de fazer uma funçao que alterasse directamente o ID (sem criar um novo funcionario, por exemplo) e, dessa forma, destruindo o factor unico associado ao ID. Por exemplo, inserimos 10 funcionarios. O ID é 10. Mas ha um programador que se lembra que a cada 10 funcionarios o ID passa a 1, por exemplo, e insere essa funcionalidade no programa. Eu queria impedir precisamente essa situaçao, ha linguagens de programaçao em que é possivel fazer isso (e em C tambem, mas envolve mexer com funcionalidades mais avançadas).

No entanto, e como se trata de uma cadeira em que se aprende a manipular arrays e assim, muito possivelmente a validaçao pedida no enunciado será para percorrer o array, ver que ainda nao existe aquele ID e dizer que está tudo bem

Editado por pmg
removi calão

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

1º - se estás a usar C, só existe uma maneira de esconder dados, que é usar alusões para tipos de dados não definidos.

// dados.h
typedef struct Elem Elem;

// dados.c
struct Elem
{
 int id;
}

2º - Mesmo assim, nada te garanta que se um segundo programador faça um cast para qualquer coisa e ande a mexer na memória "à la gardé"

3º - diz-me que ID será apresentado neste caso:

ElemList * createList();
void       destroyList(ElemList ** list, unsigned int list_size);
Elem *     insertElem(ElemList * list, unsigend int list_size);
void       removeElem(ElemList * list, unsigend int list_size, unsigend int id);

int    getElemID(Elem * elem);

int main()
{
 Elem * elem = NULL;
 ElemList * list = NULL;
 unsigned int list_size = 0, i = 0;

 list = createList();

 for (i = 0; i < 10; i++)
 {
   elem = insertElem(list, list_size);
   printf("%d\n",getElemID(elem);                // <------- que id será apresentado em cada ciclo ?
   removeElem(list, list_size, getElemID(elem));
 }

 destroyList(&list, list_size);

 return 0;
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Alcap

1º - se estás a usar C, só existe uma maneira de esconder dados, que é usar alusões para tipos de dados não definidos.

// dados.h
typedef struct Elem Elem;

// dados.c
struct Elem
{
 int id;
}

2º - Mesmo assim, nada te garanta que se um segundo programador faça um cast para qualquer coisa e ande a mexer na memória "à la gardé"

3º - diz-me que ID será apresentado neste caso:

ElemList * createList();
void	   destroyList(ElemList ** list, unsigned int list_size);
Elem *	 insertElem(ElemList * list, unsigend int list_size);
void	   removeElem(ElemList * list, unsigend int list_size, unsigend int id);

int	getElemID(Elem * elem);

int main()
{
 Elem * elem = NULL;
 ElemList * list = NULL;
 unsigned int list_size = 0, i = 0;

 list = createList();

 for (i = 0; i < 10; i++)
 {
elem = insertElem(list, list_size);
printf("%d\n",getElemID(elem);				// <------- que id será apresentado em cada ciclo ?
removeElem(list, list_size, getElemID(elem));
 }

 destroyList(&list, list_size);

 return 0;
}

Nunca trabalhei com listas em C, só em C++ e Java, mas como é que estas a inserir um elemento na lista, com a funçao a receber apenas o apontador para lista e o tamanho da lista? Normalmente recebe tambem o elemento a inserir!

Ah, outra coisa... O elem nao passa de NULL a outro tipo qualquer, ou seja, o elem está sempre a NULL. Isso vai dar barraco no printf...

Nao sei se percebi bem o teu codigo, mas pelo que estou a ver, estas a inserir um elemento, fazer o printf do seu ID e depois a retira-lo. No entanto, nunca inicializas o elemento, e como estas sempre a inserir e a remover o mesmo elemento (e este está sempre a NULL) vais ter 10 barracos no printf.

Ou é isso ou ha qualquer m**** que nao consegui perceber no teu codigo, e estas na realidade a ir buscar um elemento real à lista. Palavra que nao percebi o teu insere, como é que um metodo para inserir pode retornar um elemento?

Obrigado pela ajuda, já agora... Esta discussão já se tornou irrelevante para o problema, mas é bastante interessante!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Obrigado pela ajuda, já agora... Esta discussão já se tornou irrelevante para o problema, mas é bastante interessante!

Isso só demonstra a falta de hábito que tens na criação de código.

O que foi apresentado é mais do que esclarecedor para o problema em questão

Vamos então por partes:

mas como é que estas a inserir um elemento na lista, com a funçao a receber apenas o apontador para lista e o tamanho da lista? Normalmente recebe tambem o elemento a inserir!

Em C++ e em Java, quando tens um construtor sem argumentos, podes instanciar uma classe sem dados não podes ?

O que me impede de fazer o mesmo ? Adiciono um elemento à lista e depois se quiser, mais tarde, altero os valores do elemento/objecto criado.

Ah, outra coisa... O elem nao passa de NULL a outro tipo qualquer, ou seja, o elem está sempre a NULL. Isso vai dar barraco no printf...

Não faço ideia de como tiraste a conclusão de que que a variável elem não foi inicializada. É mais do que claro que o foi:

elem = insertElem(list, list_size); // que valor achas que "elem" tem agora ??? NULL ???

Agora, deverias era tentar responder à pergunta, se tomares os moldes da solução que escolheste:

No entanto, e como se trata de uma cadeira em que se aprende a manipular arrays e assim, muito possivelmente a validaçao pedida no enunciado será para percorrer o array, ver que ainda nao existe aquele ID e dizer que está tudo bem

O que acontece é se pesquisares pelo maior número identificador atribuído existente na lista, como a lista se encontra vazia, o valor será sempre o mesmo (provavelmente 1).

Mesmo que existam elementos na lista, se removeres o elemento com o valor maior de ID, o próximo tomará o seu valor.

Este pormenor invalida a premissa de criação de um número identificador para o registo.

Continuas a pensar que a discussão continua a ser irrelevante para o problema ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Alcap

Isso só demonstra a falta de hábito que tens na criação de código.

O que foi apresentado é mais do que esclarecedor para o problema em questão

Vamos então por partes:

Em C++ e em Java, quando tens um construtor sem argumentos, podes instanciar uma classe sem dados não podes ?

O que me impede de fazer o mesmo ? Adiciono um elemento à lista e depois se quiser, mais tarde, altero os valores do elemento/objecto criado.

Não faço ideia de como tiraste a conclusão de que que a variável elem não foi inicializada. É mais do que claro que o foi:

elem = insertElem(list, list_size); // que valor achas que "elem" tem agora ??? NULL ???

Agora, deverias era tentar responder à pergunta, se tomares os moldes da solução que escolheste:

O que acontece é se pesquisares pelo maior número identificador atribuído existente na lista, como a lista se encontra vazia, o valor será sempre o mesmo (provavelmente 1).

Mesmo que existam elementos na lista, se removeres o elemento com o valor maior de ID, o próximo tomará o seu valor.

Este pormenor invalida a premissa de criação de um número identificador para o registo.

Continuas a pensar que a discussão continua a ser irrelevante para o problema ?

É irrelevante para o problema a partir do momento em que eu cheguei à conclusao de como o resolver (e que dei no post #17). Vou ver qual é o numero que devo atribuir, percorro o array a ver se já existe, se existir incrementa e volta a percorrer a ver se existe. Se nao existir, atribui. É podre, mas nao posso fazer de outra forma. Dai esta discussao ser completamente irrelevante para o problema!

Segundo, a tua funçao de inserir esta completamente maluca! Entao, como é que vais inserir um elemento sem o passar? Magia? E depois retornas um elemento? Volto a dizer que nao percebi!

Tu estas a retornar um elemento, certo... Mas se a lista estava vazia e o inseriste a NULL, ele ao ser retornado nao vem "cheio", por magia!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

como pareces ser como São Tomé que necessita de ver para crer, compila este código

(só para chatear até fiz o código sem o parâmetro tamanho de lista)

// list.h
#ifndef LIST_H
#define LIST_H

#define NAME_SIZE 100

typedef struct Elem
{
char name[NAME_SIZE];
}Elem;

typedef struct List List;

Elem * listInsert(List ** list);
void   listRemove(List ** list, unsigned int id);
void   listClear(List ** list);

int    elemGetID(Elem * elem);
char * elemGetName(Elem * elem);

#endif /* LIST_H */

#include "list.h"

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

/* estrutura com o valor de ID escondido */
typedef struct RealElem 
{
char name[NAME_SIZE];

unsigned int id;
} RealElem;

/* estrutura de um no da lista */
struct List
{
struct List * next;
RealElem elem;
};

static unsigned int list_next_id;

Elem * listInsert(List ** list)
{
List * aux = *list, * iter = NULL;
unsigned int new_id = 0;

/* pesquisar pelo ID mais alto atribuido */
iter = *list;
while (iter != NULL)
{
	new_id = new_id > iter->elem.id ? new_id : iter->elem.id;
	iter = iter->next;
}

// verificar lista vazia
if (aux == NULL)
{
	/* alocar meória para o primeiro elemento */
	*list = malloc(sizeof(List));
	aux = *list;
}
else
{
	/* procurar o ultimo elemento */
	while (aux->next != NULL)
		aux = aux->next;

	/* alocar o elemento no fim da lista */
	aux->next = malloc(sizeof(List));
	aux = aux->next;
}

/* iniciar os elemento do elemento alocado a zero */
aux->next = NULL;
memset(aux->elem.name, 0, NAME_SIZE);

/* atribuir o valor seguinte */
aux->elem.id = new_id + 1;

/* DESCOMENTAR O CODIGO SEGUINTE PARA TERES ID UNICO */
/*
aux->elem.id = list_next_id;
list_next_id++;
*/

return (Elem *)&aux->elem;
}

void listRemove(List ** list, unsigned int id)
{
List * aux = *list, * del = NULL;

/* verificar lista vazia */
if (aux != NULL)
{
	/* verificar primeiro elemento */
	if (aux->elem.id == id)
	{
		/* redefinir o primeiro elemento */
		*list = aux->next;

		/* libertar a memoria do primeiro elemento */
		free(aux);
	}
	else
	{
		/* pesquisar pelo elemento antes do elemento a ser removido */
		while (aux->next != NULL && aux->next->elem.id != id)
			aux = aux->next;

		/* guardar o ponteiro para o no a ser removido */
		del = aux->next;

		/* remover o no da lista */
		aux->next = aux->next->next;

		/* libertar a memoria do primeiro elemento */
		free(del);
	}
}
}

void listClear(List ** list)
{
List * aux = *list, * del = NULL;

/* ciclo de remocao dos elementos */
while (aux != NULL)
{
	/* guardar o ponteiro para o no a ser removido e incrementar o ciclo*/
	del = aux;
	aux = aux->next;

	/* libertar a memoria do elemento */
	free(del);
}

/* marcar a lsita como vazia */
*list = NULL;
}

int elemGetID(Elem * elem)
{
/* retornar o id do elemento */
return ((RealElem *)elem)->id;
}

char * elemGetName(Elem * elem)
{
/* retornar o nome do elemento */
return elem->name;
}

#include "stdlib.h"
#include "stdio.h"

#include "list.h"

int main()
{
Elem * elem = NULL;
List * list = NULL;
unsigned int i = 0;

for (i = 0; i < 10; i++)
{
	elem = listInsert(&list);

	printf("id : %d | name : %s\n", elemGetID(elem), elemGetName(elem));
	listRemove(&list, elemGetID(elem));
}

listClear(&list);

return 0;
}

depois remove as linhas de código comentadas no ficheiro list.c para veres a diferença


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Alcap

como pareces ser como São Tomé que necessita de ver para crer, compila este código

(só para chatear até fiz o código sem o parâmetro tamanho de lista)

// list.h
#ifndef LIST_H
#define LIST_H

#define NAME_SIZE 100

typedef struct Elem
{
char name[NAME_SIZE];
}Elem;

typedef struct List List;

Elem * listInsert(List ** list);
void   listRemove(List ** list, unsigned int id);
void   listClear(List ** list);

int	elemGetID(Elem * elem);
char * elemGetName(Elem * elem);

#endif /* LIST_H */

#include "list.h"

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

/* estrutura com o valor de ID escondido */
typedef struct RealElem
{
char name[NAME_SIZE];

unsigned int id;
} RealElem;

/* estrutura de um no da lista */
struct List
{
struct List * next;
RealElem elem;
};

static unsigned int list_next_id;

Elem * listInsert(List ** list)
{
List * aux = *list, * iter = NULL;
unsigned int new_id = 0;

/* pesquisar pelo ID mais alto atribuido */
iter = *list;
while (iter != NULL)
{
	new_id = new_id > iter->elem.id ? new_id : iter->elem.id;
	iter = iter->next;
}

// verificar lista vazia
if (aux == NULL)
{
	/* alocar meória para o primeiro elemento */
	*list = malloc(sizeof(List));
	aux = *list;
}
else
{
	/* procurar o ultimo elemento */
	while (aux->next != NULL)
		aux = aux->next;

	/* alocar o elemento no fim da lista */
	aux->next = malloc(sizeof(List));
	aux = aux->next;
}

/* iniciar os elemento do elemento alocado a zero */
aux->next = NULL;
memset(aux->elem.name, 0, NAME_SIZE);

/* atribuir o valor seguinte */
aux->elem.id = new_id + 1;

/* DESCOMENTAR O CODIGO SEGUINTE PARA TERES ID UNICO */
/*
aux->elem.id = list_next_id;
list_next_id++;
*/

return (Elem *)&aux->elem;
}

void listRemove(List ** list, unsigned int id)
{
List * aux = *list, * del = NULL;

/* verificar lista vazia */
if (aux != NULL)
{
	/* verificar primeiro elemento */
	if (aux->elem.id == id)
	{
		/* redefinir o primeiro elemento */
		*list = aux->next;

		/* libertar a memoria do primeiro elemento */
		free(aux);
	}
	else
	{
		/* pesquisar pelo elemento antes do elemento a ser removido */
		while (aux->next != NULL && aux->next->elem.id != id)
			aux = aux->next;

		/* guardar o ponteiro para o no a ser removido */
		del = aux->next;

		/* remover o no da lista */
		aux->next = aux->next->next;

		/* libertar a memoria do primeiro elemento */
		free(del);
	}
}
}

void listClear(List ** list)
{
List * aux = *list, * del = NULL;

/* ciclo de remocao dos elementos */
while (aux != NULL)
{
	/* guardar o ponteiro para o no a ser removido e incrementar o ciclo*/
	del = aux;
	aux = aux->next;

	/* libertar a memoria do elemento */
	free(del);
}

/* marcar a lsita como vazia */
*list = NULL;
}

int elemGetID(Elem * elem)
{
/* retornar o id do elemento */
return ((RealElem *)elem)->id;
}

char * elemGetName(Elem * elem)
{
/* retornar o nome do elemento */
return elem->name;
}

#include "stdlib.h"
#include "stdio.h"

#include "list.h"

int main()
{
Elem * elem = NULL;
List * list = NULL;
unsigned int i = 0;

for (i = 0; i < 10; i++)
{
	elem = listInsert(&list);

	printf("id : %d | name : %s\n", elemGetID(elem), elemGetName(elem));
	listRemove(&list, elemGetID(elem));
}

listClear(&list);

return 0;
}

depois remove as linhas de código comentadas no ficheiro list.c para veres a diferença

Opa, neste momento nao estou mesmo com tempo para ver isso, mas mal tenha eu compilo isso e analiso melhor o codigo. Estas subscrito a este topico? Se nao estiveres tambem nao me importo de te mandar uma PM quando postar a resposta...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Se abstraíres toda a lógica da tal lista para um ficheiro .c separado consegues criar uma variável "privada" na qual podes armazenar o último id atribuído.

/* number.c */
static int number = 0;

int get_number (void)
{
   return ++number;
}

/* main.c */
#include <stdio.h>

extern int get_number (void);

int main (void)
{
   int i;
   for (i = 0; i < 10; ++i) {
       printf("Número: %d\n", get_number());
   }

   return 0;
}

Neste caso, a variável number só pode ser manipulada por funções presentes no ficheiro number.c. Claro que tudo depende do que queres fazer e dos requisitos que tens em termos de "segurança" do código...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.