Manipulando os ponteiros...

Manipulando os ponteiros...

por Karina Silva -
Número de respostas: 6
Oi, eu estava implementando o quicksort alterando somente os ponteiros e surgiu a seguinte dúvida: implementei e vi que deu uma falha de segmentação. Daí, comecei a simular e percebi que qndo termino o 1o. separa, ele deveria passar como parâmetro o endereço do primeiro da lista. Fiz para a seguinte lista:

7,0 -> 7,6 -> 5,8 -> 2,7 -> 8,4 -> 8,0 -> 5,7 -> 8,1 -> 5,1 -> 3,4

Ele foi trocando, trocando, até que a lista ficou assim:

8,1 -> 7,6 -> 8,0 -> 8,4 -> 2,7 -> 5,8 -> 5,7 -> 7,0 -> 5,1 -> 3,4

Daí, terminaria a 1a. iteração, devolve o endereço do 8,4 e ele deveria recomeçar fazendo o quicksort pelo 8,1 e pelo 8,4. Mas vi que ele estava fazendo com o 7,0! Dai ele fez td errado. Sendo assim, eu devo usar ponteiro de ponteiro no método? Por que ele pegou o valor antigo? Usei ponteiro "simples", ou seja, algo do tipo: quicksort(Filme *esquerda, Filme *direita).
Dai e fiz a chamda no main assim: quicksort(lista->inicio, lista->fim).


PS: Tenho certeza que não há problemas com os ponteiros pq fiquei imprimindo a lista e não havia nenhum problema...
Em resposta à Karina Silva

Re: Manipulando os ponteiros...

por João Francisco Amorim Enomoto -
Passa na monitoria algum dia desses. Seu programa deve ter ou algum erro lógico ou algum ponteiro que está sendo perdido.

Abraços!
Em resposta à João Francisco Amorim Enomoto

Re: Manipulando os ponteiros...

por Karina Silva -
Hum... Acho q descobri o erro... Eu deveria ter feito atribuições do tipo *ponteiro1 = *ponteiro2? Se eu o fizer, eu vou estar copiando todo o conteúdo do ponteiro ou altero o endereço apontado por eles?
Em resposta à Karina Silva

Re: Manipulando os ponteiros...

por João Francisco Amorim Enomoto -
Se ponteiro1 e ponteiro2 são dois ponteiros, *ponteiro1 = *ponteiro2 faz com que o valor apontado por ponteiro1 seja o mesmo apontado por ponteiro2. Não há alteração da memória, mas sim dos valores associados aos ponteiros.

Abraços
Em resposta à Karina Silva

Re: Manipulando os ponteiros...

por Karina Silva -
Oi, tentei mudar para ponteiro de ponteiro mas não consigo implementar. Eu tentei fazer esse exemplo:

void muda1(Filme *a, Filme *b){
Filme *aux;
aux = (Filme*)malloc(sizeof(Filme));
/*Neste caso nao serve pq eu estaria alocando um novo espaço na memória e não é isso que deveria ser feito no bônus...*/
*aux = *a;
*a=*b;
*b=*aux;
}

void muda2(Filme **a, Filme **b){
Filme **aux;
aux=a;
a=b;
b=aux;
}

void muda3(Filme *a, Filme *b){
Filme *aux;
aux=a;
a=b;
b=aux;
}

int main(){
Filme **p, **q, *a, *b;
a = (Filme*)malloc(sizeof(Filme));
a->nota=-1;
b=(Filme*)malloc(sizeof(Filme));
b->nota=-2;
p = &a;
q = &b;
/*muda3(*q, *w);
muda2(q,w);*/
muda1(*q, *w);
}

Eu esperava que no método troca, as variáveis tivessem nota trocada. Apenas em muda1 isso aconteceu, mas não dessa forma q devemos fazer... Não consegui mudar fazendo pelo muda2 e pelo muda3... O q fiz de errado?

PS: Onde encontro algum livro ou site q explique ponteiro de ponteiro sem q seja uma matriz? Soh encontro isso...