Jump to content

Recommended Posts

Posted

Boas!

Primeiro Feliz Natal a todos 😁

Agora vem a minha duvida, eu tenho que remover um elemento dentro de uma matriz, eu pensei em colocar essa posição a null e fiz isto, so que da me um erro de segmentação,

typedef struct{
long num;

}Pessoa;
int main(int argc, char** argv) {

Pessoa pessoas[2][2];
Pessoa *pessoa;
pessoa=NULL;



pessoas[0][0].num=123;
pessoas[0][0]=(*pessoa);



return (EXIT_SUCCESS);
}
Posted

o teu código tem vários problemas :

1º:

Pessoa *pessoa;
pessoa=NULL; // pessoa é um ponteiro para uma estrutura Pessoa na posição de memória NULL (normalmente 0)

*pessoa; // valor (estrutura) Pessoa que se encontra na posição de memória referênciada pelo ponteiro (endereço 0 = Segmentation Fault)

tens uma matrix de estruturas e não uma matrix de ponteiros para estruturas, logo não podes "retirar" uma estrutura da matrix.

terás de arranjar uma postra forma de marcar a posição como "sem pessoa"

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

Eu tinha feito de outra forma, mas acho que não esta muito correcto

#include <stdio.h>
#include <stdlib.h>
typedef struct{
long num;

}Pessoa;
int main(int argc, char** argv) {

Pessoa pessoas[2][2];
Pessoa pessoa;


pessoas[0][0].num=123;
pessoas[0][0]=(pessoa);



return (EXIT_SUCCESS);
}
Posted

pois não ...

o método normal de marcar um elemento de uma lista/matriz de estruturas como não existente é com um marcador

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

typedef struct{
 int valid; // marcador de pessoa valida
 long num;
}Pessoa;

int main(int argc, char** argv) {
 Pessoa pessoas[2][2];

 // colocar todos os bytes da matriz a zeros (logo todos os valores da estutura Pessoa de todas as estruturas)
 // por consequinte, todos os valores dos marcadores a zero (inválido)
 memset(pessoas, 0, sizeof(pessoas)); 

 // adicionar uma pessoa necessita agora de actualizar o marcador
 pessoas[0][0].num = 123;
 pessoas[0][0].valid = 1;

 return (EXIT_SUCCESS);
}
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

colocar valid a zeros, claramente não elimina os valores lá existentes ...

a única coisa que estas a fazer é marcar a informação como "lixo"

como te disse acima, tendo uma matrix de estruturas, não podes "tirar" uma estrutra dela.

pensa assim :

tens um array/matriz de estruturas. isto significa que tens um bloco de memória com o tamanho

Número de elementos*Tamanho da estrutura

logo é impossivel "eliminar memória" lá pelo meio.

se queres "apagar tudo", usa o memset:

memset(&matrix[n][m], 0, sizeof(NomeEstrutura));

existe a possibilidade de usares um array/matriz de ponteiros, mas para isso é necessário manipular memória dinâmica

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

Sim, eu para remover tudo do vetor tinha feito como fiz em cima depois só acresentei contador =0, mas secalhar colocar tudo " a zeros" é o mais indicado para este caso

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.