Jump to content
AJBM

NULL

Recommended Posts

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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);
}

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


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