Duda con Punteros - Me tira error en todas las lineas.

Iniciado por palacio29, 15 Septiembre 2016, 01:49 AM

0 Miembros y 1 Visitante están viendo este tema.

palacio29

Hola

Estoy haciendo un ejercicio de punteros. El ejercicio consta en el que tengamos un struct con el numero de una carta, su valor y el tipo de carta (espada,copa,oro,basto,etc). Lo que tengo que hacer es cargar 3 variables de este tipo y con punteros, ordenarlas de manera que si una carta es de mayor valor, tiene que mostrarse primero y el espacio de memoria debe ser intercambiado por la carta que tiene un valor menor. No se si me explico.

En el struct va ordenado  ( numero de la carta (Ejemplo 1), valor de la carta (Si es un ancho de espadas va un 10 por ejemplo), y el palo de la carta (e = espada, c= copa, o = oro , b = basto)
Hasta ahora hice lo siguiente

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int numero;
int valor;
char palo;
}
t_carta;

void INTERCAMBIO(t_carta *,t_carta *  ,t_carta * );
int main()
{
    t_carta c1,c2,c3;
    c1.numero=3;
    c1.palo='c';            ///Cargo las 3 Cartas
    c1.valor=6;
    c2.numero=1;
    c2.valor=10;
    c2.palo='e';
    c3.numero=3;
    c3.valor=6;
    c3.palo='c';

    printf ("Cartas Sin Ordenar\n");
    printf ("%d - %d - %c",c1.numero,c1.valor,c1.palo);
    printf ("%d - %d - %c",c2.numero,c2.valor,c2.palo);  ///Imprimo las 3 CARTAS SIN ORDENARLAS
    printf ("%d - %d - %c\n",c3.numero,c3.valor,c3.palo);

    INTERCAMBIO(&c1,&c2,&c3);   /// Le paso la direccion de memoria de las 3 cartas a la funcion!

    printf ("Ordenado:\n");
    printf ("%d - %d - %c",c1.numero,c1.valor,c1.palo);
    printf ("%d - %d - %c",c2.numero,c2.valor,c2.palo);
    printf ("%d - %d - %c\n",c3.numero,c3.valor,c3.palo);

    return 0;
}
void INTERCAMBIO(t_carta *pa,t_carta *pb  ,t_carta *pc)   ///Y ACA SALE TODO ERROR!!! T_T
{
    t_carta aux;

    if ((*pa->valor)<(*pb->valor))
    {
        aux=*pb.valor;
        *pb.valor=*pa.valor;
        *pa.valor=aux;
    }
    if (*pb.valor<*pc.valor)
    {
        aux=*pc.valor;
        *pc.valor=*pb.valor;
        *pb.valor=aux;
    }
    if (*pa.valor<*pc.valor)
    {
        aux=*pc.valor;
        *pc.valor=*pa.valor;
        *pa.valor=aux;
    }





}

ThunderCls

Tienes que ver un poco mas el tema de los punteros pues tienes varios problemas de concepto. Primero, al simbolo "*" antepuesto a una variable declarada como puntero es el simbolo derreferenciador de dicho puntero, o en otras palabras si usas esto:

Código (cpp) [Seleccionar]
int *p; // direccion de memoria de una variable entera
int a = 3; // variable entera


Solo puedes asignar un valor de la forma:

Código (cpp) [Seleccionar]
*p = a; // derreferenciando el puntero, o lo que es lo mismo refiriendote directamente a la memoria de dicha variable y no a su direccion
p = &a; // asignando la direccion de memoria de la variable entera


O sea, lo que estas haciendo en esta linea por ejemplo:

Cita de: palacio29 en 15 Septiembre 2016, 01:49 AM
Código (cpp) [Seleccionar]
if ((*pa->valor)<(*pb->valor))

Es un error total, pues estas usando otro simbolo "->" que se usa para referirse al valor al que apunta tu direccion de memoria (en este caso pa/pb), pero a la vez lo estas derreferenciando, o lo que vendria siendo lo mismo, estas tratando una variable "no puntero" como puntero al utilizar luego el "->". Siendo las dos formas correctas:

Código (cpp) [Seleccionar]
if ((pa->valor) < (pb->valor)) // Forma 1
if (((*pa).valor) < ((*pb).valor)) // Forma 2


Luego ese error lo sigues cometiendo a traves de el resto del codigo y hay algo mas en estas lineas:

Cita de: palacio29 en 15 Septiembre 2016, 01:49 AM
Código (cpp) [Seleccionar]
aux=*pb.valor;
*pa.valor=aux;


Tienes otro error de concepto. Primero declaras aux como variable de tipo structura t_carta y despues intentas asignar un valor tipo entero (pb->valor) a la variable aux que es tipo estructura. La forma correcta es:

Código (cpp) [Seleccionar]
aux = *pc; // Asignas la estructura completa derreferenciando el puntero
aux.valor = pc->valor; // Asignas una variable entera a su igual en la estructura


Con esos arreglos deberian solucionarse los errores
Saludos
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/