eliminar um livro de uma estrutura de livros - C - Portugal-a-Programar
eliminar um livro de uma estrutura de livros
Por suzy, 31 de Agosto de 2007 em C
quero eliminar uma cota(livro) de um vector de estruturas, tenho esta solução, mas nao me corre. :hmm:
# define DIM 2
int elimina (struct livro *p,int dim)
int cota, i;
printf(" introduza cota a eliminar\n");
scanf("%d",&cota);
for(i=0;i<dim && p[i].cota!=cota;i++)
printf(" livro inestente\n");
p[i]=p[dim-1];
return dim-1;
struct livro vet[DIM]={{"susana",123},{"rui",234}};
elimina(vet,DIM);
alguem sabe um forma mais facil ou porque isto nao corre??
int elimina (struct livro *p,int dim) {
// So percorres o for uma vez sem nada, para obteres a posicao i
// o if vem fora do for, se fosse dentro do for o i nunca seria igual a dim
for(i=0;i<dim && p[i].cota!=cota;i++);
if(i==dim) {
Presumo que queiras o vector sempre do mesmo tamanho e teres o dim a indicar o numero de elementos. Caso contrário, e se estiveres sempre a reservar um espaço novo na altura em que adicionas um elementos novo irás ficar com memory leak.
Faltam chavetas para fechar a função elimina....
nunca façam isso...
Não deveria ser fflush(stdout)?
ela quer "limpar" o stdin e não o stdout, por isso o fflush(stdout) não servia para nada.
a função que tem por objectivo "limpar" buffers de leitura (como é o caso do stdin), é o fpurge, que tem o inconveniente de não ser standard. por isso, normalmente a melhor maneira de resolver o problema é usando funções como o getchar/scanf.
a função que tem por objectivo "limpar" buffers de leitura (como é o caso do stdin), é o fpurge, que tem o inconveniente de não ser standard.
Ainda há uns dias estive a pesquisar sobre este assunto, e pelo que encontrei esse função só é compatível com sistemas BSD.
A melhor solução é usar o scanf.
penso que foi aí que ela surgiu inicialmente, mas actualmente já podemos encontrar em algumas versões do Linux (e certamente noutros SOs). mas não deixa de ser um risco usá-la.
Porque dizem que redimensionar um vector pode causar um memmory leak ? :s
Se utilizares memória dinâmica em C tens de reservar e libertar a memória manualmente. Por isso é que se não o fizeres, ficas com memory leaks.
Ok, mas então imaginemos num ciclo while posso fazer um preserve ao que já lá tinha no vector(array) e criar mais um espaço.
Depois no fim de usar faço um libertar de memória right ?
Realocar memória é um processo muito lento, provavelmente o melhor seria usar a estratégia das classes da STL: se chegaste ao limite da capacidade do teu array, aumenta-a para o dobro. Assim não andas sempre a realocar memória.
Claro que se estivermos a falar de arrays gigantescos, cuidado se tens memória suficiente e liberta sempre a memoria que deixaste de usar...