AJBM Posted December 25, 2012 at 12:15 PM Report #488349 Posted December 25, 2012 at 12:15 PM 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); }
HappyHippyHippo Posted December 25, 2012 at 01:26 PM Report #488352 Posted December 25, 2012 at 01:26 PM 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) 2º 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 Portugol Plus
AJBM Posted December 25, 2012 at 03:59 PM Author Report #488361 Posted December 25, 2012 at 03:59 PM 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); }
HappyHippyHippo Posted December 25, 2012 at 07:24 PM Report #488367 Posted December 25, 2012 at 07:24 PM 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 Portugol Plus
AJBM Posted December 25, 2012 at 07:36 PM Author Report #488368 Posted December 25, 2012 at 07:36 PM 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
HappyHippyHippo Posted December 26, 2012 at 09:30 AM Report #488398 Posted December 26, 2012 at 09:30 AM (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 December 26, 2012 at 09:30 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
AJBM Posted December 26, 2012 at 11:41 AM Author Report #488419 Posted December 26, 2012 at 11:41 AM ok obrigado pela ajuda 👍 Ja agora se eu quiser eliminar Todo o conteúdo de um vector, devo utilizar memset ou existe outra forma mais correcta?
HappyHippyHippo Posted December 26, 2012 at 12:18 PM Report #488421 Posted December 26, 2012 at 12:18 PM 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 Portugol Plus
AJBM Posted December 26, 2012 at 12:24 PM Author Report #488423 Posted December 26, 2012 at 12:24 PM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now