Jump to content

Apagar conteudo de uma posicao no vector


Recommended Posts

Posted

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?

Posted

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.

  • 6 months later...
Posted

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.

Desaparecido.

  • 2 weeks later...
Posted

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.

Posted

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.

Desaparecido.

Posted

"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

Posted

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  😄

here since 2009

Posted

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;

Desaparecido.

Posted

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 😄

here since 2009

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.