• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

suzy

eliminar um livro de uma estrutura de livros

12 mensagens neste tópico

:eek:

quero eliminar uma cota(livro) de um vector de estruturas, tenho esta solução, mas nao me corre.  :hmm:

#include<stdio.h>
# define DIM 2


struct livro {
         char nome[10];
         int cota;
         };



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++)
        
            {
            if(i==dim)
              {
              printf(" livro inestente\n");
              return dim;
              }
            else
               {
              p[i]=p[dim-1];
              return dim-1;
              }
              
main()
{
struct livro vet[DIM]={{"susana",123},{"rui",234}};
elimina(vet,DIM);

fflush(stdin);
getchar();
}

alguem sabe um forma mais facil ou porque isto nao corre??

obrigada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#include<stdio.h>
# define DIM 2

struct livro {
  char nome[10];
  int cota;
};

int elimina (struct livro *p,int dim) {
  int cota, i;
  printf(" introduza cota a eliminar\n");
  scanf("%d",&cota);

  // 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) {
    printf(" livro inestente\n");
    return dim;
  } else {
    p[i]=p[dim-1];
    return dim-1;
  }

void main() {
  struct livro vet[DIM]={{"susana",123},{"rui",234}};
  elimina(vet,DIM);

  fflush(stdin);
  getchar();
}

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

  fflush(stdin);

nunca façam isso...

Não deveria ser fflush(stdout)?
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque dizem que redimensionar um vector pode causar um memmory leak ? :s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link 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