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

Upper

Apagar conteudo de uma posicao no vector

17 mensagens neste tópico

Boas... tou com um problemas mas nao consigo resolver.....quero apagar uma dada informação numa posicao do vector mas não sei como fazer excepto usando free.....e eu nao posso usar free...alguem me pode ajudar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

só usas o free para libertar um espaço de memória que tenha sido previamente alocado com o malloc.

o que tens no array?

em c não é possivel apagar nada do que está na memória, tem sempre de estar alguma coisa em cada posição. o que se pode fazer é marcar uma posição como estando livre, por exemplo, metendo lá um valor que não faça sentido no contexto do probelema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No array tenho varios dados(nomes, valores, numeros).

Entao o que tenho de por nessa posicao e zeros?

Mas se ta num array não se pode apagar nada?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas é um array de que tipo? um array de inteiros? apontadores?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então colocas a posição que queres "apagar" a NULL.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tenho um problema semelhante, mas estou com dificuldade em fazer o codigo, alguem pode ajudar ponto um exemplo concreto que possa aproveitar o codigo para o meu problema

obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu nem percebi completamente o problema original, foi tudo muito vago para se poder dar uma resposta mais concreta.

Tens que explicar melhor o problema, ou mostrar o código que não está a funcionar, como disse o Localhost.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas, eu tenho uma duvida tambem, eu tenho esta struct:

typedef struct {

    int nUtentes ;//auto-increment

    char nome[51];

    char bi[10];

    char morada[51];

    char tele[10];

} tipoUtente;

e tenho um vector a usar essa struct:

tipoUtente utente[10];

e imaginando que tenho esse vector todo preenchido, como posso apagar por exemplo a posição 4 do vector ?

utente[4] = NULL funciona ? basta isto ?

obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

NULL utilizasse para ponteiros e não para variáveis normais. Talvez seja melhor utilizares listas ligadas...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

como assim ? eu tou um pouco  a nora com esta parte, nao a percebo muito bem  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

NULL em C é o valor zero. Não há qualquer problema em ser utilizado com "variáveis normais".

Agora, o que estás a fazer não faz o que pretendes. Provavelmente nem compila.

"Apagar" uma posição num array depende da interpretação. Se declaras um array com 10 posições, ele vai ter 10 posições até ser destruído. O que possivelmente terás que fazer é copiar os dados das posições a seguir à que queres apagar para uma posição antes.

Por exemplo, se queres apagar o utente[ 4 ], copias o utente[ 5 ] para utente[ 4 ], utente[ 6 ]para utente[ 5 ], etc., e decrementas o contador (que decerto terás algures) para indicar que tens um utente a menos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"Por exemplo, se queres apagar o utente[ 4 ], copias o utente[ 5 ] para utente[ 4 ], utente[ 6 ]para utente[ 5 ], etc., e decrementas o contador (que decerto terás algures) para indicar que tens um utente a menos."

e como posso fazer isso ? nao me consegue arranjar uma especie de exemplo onde possa modificar para o meu programa ? :x eu nao tou mesmo a ver o que fazer ai

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que NULL costuma ser mesmo utilizado para ponteiros (não esquecer que em listas ligadas o final é um NULL). Aliás ao atribuir NULL a uma variável "normal" dá um warning.

Para fazeres o que o TheDark disse tens de ter uma estrutura auxiliar em que vão estar os dados da estrutura anterior à retirada e depois é só copiar os dados da estrutura auxiliar para a estrutura anterior e assim sucessivamente até chegares ao 0.

struct teste{
  int blah;
} test[ 5 ];

struct auxiliar {
  int numaux;
} aux;

int i_cont = 4;
while(i_cont - 2 >= 0) {
  aux.numaux = test[ i_cont - 1 ].blah;
  test[ i_cont - 1 ].blah = test[ i_cont ];
  test[ i_cont - 2 ].blah = aux.numaux;
  i_cont--;
}

Penso que a implementação seja algo como isto.

Neste caso eu queria apagar o conteúdo da struct 5

Edit: Tinha-me esquecido de decrementar a variável i_cont no while  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que NULL costuma ser mesmo utilizado para ponteiros (não esquecer que em listas ligadas o final é um NULL). Aliás ao atribuir NULL a uma variável "normal" dá um warning.

Sim, dá um warning (pelo menos no compilador do VS), e sim, os warnings devem ser evitados. E embora este warning específico possa ser ignorado, tens razão. Em C, NULL é definido como (void*)0, logo não é um zero normal. Em C++ é que é simplesmente 0.

Para fazeres o que o TheDark disse tens de ter uma estrutura auxiliar em que vão estar os dados da estrutura anterior à retirada e depois é só copiar os dados da estrutura auxiliar para a estrutura anterior e assim sucessivamente até chegares ao 0.

Estrutura auxiliar? Para esmagar uma posição de um array? Não foi nada disso que eu disse. Não precisas de estrutura auxiliar nenhuma. Supondo o seguinte:

- tens um array com n posições válidas (índices de 0 a n-1);

- queres eliminar o índice x ( x < n );

apenas precisas de copiar os dados dos índices de x+1 até n-1 (não esquecer que são índices), respectivamente, para os índices x a n-2, ou seja, array[ x+1 ] é copiado para array[ x ], array[ x+2 ] é copiado para array[ x+1 ], ..., array[ n-1 ] é copiado para array[ n-2 ]:

int x = 5; /* 5 é o índice a alterar, n é o total de elementos válidos do array */
for (int movedor = x + 1; movedor < n; ++movedor) {
    array[movedor].campo1 = array[movedor+1].campo1;
    array[movedor].campo2 = array[movedor+1].campo2;
    array[movedor].campo3 = array[movedor+1].campo3;
}
--n;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, eu ontem quando saí do PC é que me lembrei da "barbaridade" que tinha postado  :)

Ele tem 3 maneiras (que agora me lembro) de fazer o que quer.

Declara a estrutura:

struct test {
   char name[100];
   int age;
} teste[10];

Inicializa as estruturas todas:

int i_init;
for(i_init=0;i_init<10;i_init++){
   strcpy(teste[i_init].name," ");
   teste[i_init].age = 0;
}

Depois tem 3 maneiras pelo menos:

int del;
scanf("%d", &del);
strcpy(teste[del].name,teste[9].name);
teste[del].age = teste[9].age;

int i,del;
scanf("%d", &del);
for(i=del;i<10;i++){
   strcpy(teste[i].name,teste[i+1].name);
   teste[i].age = teste[i+1].age;
}

int del;
scanf("%d", &del);
strcpy(teste[del].name," ");
teste[del].age = 0;

Estas são apenas 3 hipoteses, desculpa lá aquilo de ontem :D

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