Ir para o conteúdo
AJBM

NULL

Mensagens Recomendadas

AJBM

Boas!

Primeiro Feliz Natal a todos :cheesygrin:

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);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

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);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

E se eu agora quiser por a pessoa[0][0] a zeros não basta por valid a 0, não existe mais nenhuma forma de remover um elemento de uma matriz

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

ok obrigado pela ajuda :thumbsup:

Ja agora se eu quiser eliminar Todo o conteúdo de um vector, devo utilizar memset ou existe outra forma mais correcta?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

epa ...

memset só atribui o valor de 0 a todos os bytes de um bloco de memória.

não "remove" nada !!!

tens é de perceber que o valor zero será interpretado como inválido.


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

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

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.