Upper Posted June 11, 2009 at 06:21 PM Report #271510 Posted June 11, 2009 at 06:21 PM 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?
nata79 Posted June 11, 2009 at 06:26 PM Report #271512 Posted June 11, 2009 at 06:26 PM 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. arithmeticoverflow.wordpress.com
Upper Posted June 11, 2009 at 06:29 PM Author Report #271513 Posted June 11, 2009 at 06:29 PM No array tenho varios dados(nomes, valores, numeros). Entao o que tenho de por nessa posicao e zeros? Mas se ta num array não se pode apagar nada?
nata79 Posted June 11, 2009 at 06:35 PM Report #271515 Posted June 11, 2009 at 06:35 PM mas é um array de que tipo? um array de inteiros? apontadores? arithmeticoverflow.wordpress.com
Upper Posted June 11, 2009 at 07:41 PM Author Report #271530 Posted June 11, 2009 at 07:41 PM apontadores
Baderous Posted June 11, 2009 at 08:15 PM Report #271539 Posted June 11, 2009 at 08:15 PM Então colocas a posição que queres "apagar" a NULL.
rop44991 Posted December 31, 2009 at 04:48 AM Report #303375 Posted December 31, 2009 at 04:48 AM tenho um problema semelhante, mas estou com dificuldade em fazer o codigo, alguem pode ajudar ponto um exemplo concreto que possa aproveitar o codigo para o meu problema obrigado
Localhost Posted December 31, 2009 at 01:42 PM Report #303425 Posted December 31, 2009 at 01:42 PM O que é que já tens feito? here since 2009
TheDark Posted December 31, 2009 at 07:46 PM Report #303491 Posted December 31, 2009 at 07:46 PM 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.
taquelim Posted January 14, 2010 at 02:51 PM Report #306071 Posted January 14, 2010 at 02:51 PM 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.
Localhost Posted January 14, 2010 at 03:06 PM Report #306073 Posted January 14, 2010 at 03:06 PM NULL utilizasse para ponteiros e não para variáveis normais. Talvez seja melhor utilizares listas ligadas... here since 2009
taquelim Posted January 14, 2010 at 03:08 PM Report #306074 Posted January 14, 2010 at 03:08 PM como assim ? eu tou um pouco a nora com esta parte, nao a percebo muito bem
TheDark Posted January 14, 2010 at 03:46 PM Report #306083 Posted January 14, 2010 at 03:46 PM 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.
taquelim Posted January 14, 2010 at 03:51 PM Report #306084 Posted January 14, 2010 at 03:51 PM "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
Localhost Posted January 14, 2010 at 10:42 PM Report #306176 Posted January 14, 2010 at 10:42 PM 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
TheDark Posted January 15, 2010 at 01:30 AM Report #306193 Posted January 15, 2010 at 01:30 AM 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.
Localhost Posted January 15, 2010 at 10:03 AM Report #306206 Posted January 15, 2010 at 10:03 AM 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
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