Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

victorbrt

Problema com passagem por referência em função

Recommended Posts

Pessoal, minha dúvida é simples: estou tentando fazer uma troca de endereços entre duas variáveis em uma função por passagem de referência, mas na hora de mostrar na função principal, os valores continuam inalterados. Alguém saberia me dizer o porque e onde está meu erro? O código exemplifica melhor o que estou tentando fazer. A troca está sendo feita perfeitamente pela função.

 

#include <stdio.h>
#include <math.h>

void raizes (float a, float b, float c, float *x1, float *x2){
    double delta;
    float *aux;
    delta = b * b - 4 * a * c;
    *x1 = -b + sqrt(delta) / 2 * a;
    *x2 = -b - sqrt(delta) / 2 * a;
    if (*x2 < *x1){
        aux = x1;
        x1 = x2;
        x2 = aux;
    }
}

int main(){
    float a, b, c, x1, x2;
    printf ("Digite o valor de a: ");
    scanf ("%f",&a);
    printf ("Digite o valor de b: ");
    scanf ("%f",&B);
    printf ("Digite o valor de c: ");
    scanf ("%f",&c);
    raizes (a, b, c, &x1, &x2);
    printf ("\nValor de x1: %f", x1);
    printf ("\nValor de x2: %f\n", x2);
    return 0;
}

Agradeço qualquer ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cuidado com ponteiros pessoal...

void raizes (float a, float b, float c, float *x1, float *x2){
    double delta;
    float aux;
    delta = b * b - 4 * a * c;
    *x1 = -b + sqrt(delta) / 2 * a;
    *x2 = -b - sqrt(delta) / 2 * a;
    if (*x2 < *x1){
        aux = *x1;
        *x1 = *x2;
        *x2 = aux;
    }
}

Você não pode trocar os endereços das variáveis, mas sim o valor que está nesse endereço.

Quem administra os endereços é o compilador, e mudá-los pode ser caótico!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Victor, entendo os riscos de se trocar endereços diretamente como estou fazendo, tanto que, trocando os valores diretamente pelo operador *, do mesmo jeitinho que está aí, deu tudo certo e os valores foram trocados.

 

Porém eu fiquei curioso e queria saber porque não deu certo. Apesar de ser algo não recomendável, a lógica está correta e os endereços deveriam estar trocados. O que acontece quando o resultado é apresentado na função principal é o contrário, os valores não mudam pela troca de endereços. Queria entender o porque disso...

 

Obrigado pela resposta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas repara numa coisa, não faz sentido a troca de endereços na função que você apresentou.

Vamos acompanhar a execução do seu código a partir da chamada à função raizes.

O processador joga na pilha o valor de a, o valor de b, o valor de c, o valor de &x1 e o valor de &x2.

(vou mudar os nomes das variáveis para facilitar a visualização)

Imagine que a função raizes é chamada da seguinte forma:

raizes (x, w, z, &p1, &p2);

A pilha do sistema está mais ou menos assim:

(ao lado, o nome dos parametros dentro da função)

|-------|
|  x    | ->  a
|-------|
|  y    | ->  b
|-------|
|  z    | ->  c
|-------|
|  &p1  | ->  x1
|-------|
|  &p2  | ->  x2
|-------|

Supondo que entramos no "if" que efetua a troca de x1 com x2, a sua pilha estaria assim:

|-------|
|  x    | ->  a
|-------|
|  y    | ->  b
|-------|
|  z    | ->  c
|-------|
|  &p2  | ->  x1
|-------|
|  &p1  | ->  x2
|-------|

Experimente colocar um printf no final de função raizes para ver que afinal as coisas são trocadas, a questão é que o p1 e o p2 estão em outro lugar, ali está apenas uma cópia do seu endereço.

Não é possível mudar o endereço de variáveis alocadas estaticamente, nem faz sentido fazer isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.