Perdido al crear una función con punteros

Iniciado por jamatbar, 13 Enero 2014, 18:26 PM

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

jamatbar

Buenas, tengo el siguiente código que convierte dos caracteres hexadecimales en su correspondiente número decimal, y que al meter la secuencia qq sale del programa:

#include <stdio.h>

#define NOERROR 1
#define ERROR 0

int hexDec(char c1, char c2);
int main()
{

  /* Declaramos las variables */
  char car1;
  char car2;

  /* Bucle While para que salga con qq */
  do
    {
      printf("Introduzca dos caracteres hexadecimales: ");
      scanf(" %c %c", &car1, &car2);
     
      hexDec(car1, car2);
     
    }
while(car1 != 'q' && car2 != 'q');

  return 0;
}


int hexDec(char c1, char c2)
{

char v1;
char v2;
int cuno = NOERROR;
int cdos = NOERROR;
int resultado;

if (c1 != 'q' && c2 != 'q')
        {

          if ('0' <= c1 && c1 <= '9')
            v1 = c1 - '0';
          else if ('A' <= c1 && c1 <= 'F')
            v1 = c1 - 'A' + 10;
          else if ('a' <= c1 && c1 <= 'f')
            v1 = c1 - 'a' + 10;
          else
            {
              cuno = ERROR;
              printf("Error en el primer valor introducido\n");

            }
          if ('0' <= c2 && c2 <= '9')
            v2 = c2 - '0';
          else if ('A' <= c2 && c2 <= 'F')
            v2 = c2 - 'A' + 10;
          else if ('a' <= c2 && c2 <= 'f')
            v2 = c2 - 'a' + 10;
          else
            {
              cdos = ERROR;
              printf("Error en el segundo valor introducido\n");

            }

          if (cuno == NOERROR && cdos == NOERROR)
            {
              resultado = 16 * v1 + v2;

              printf("El valor decimal de 0x%c%c es %d\n", c1, c2,
                     resultado);

            }
        }

cuno = NOERROR;
        cdos = NOERROR;


return resultado;

}


Este código lo entiendo, pero ahora me piden lo siguiente:

Modifique el código añadiendo una nueva función leeCaracter que solicite los dos caracteres hexadecimales, y que devuelva:

- 0 si se ha introducido el código qq de salida.
- 1 si se han introducido dos caracteres hexadecimales correctos

La función también devolverá por referencia los dos caracteres hexadecimales leídos. En el caso de que los caracteres hexadecimales no fuesen correctos, la función deberá volver a solicitarlos. Es decir, la función sólo puede devolver 1 y dos caracteres hexadecimales correctos por referencia, o 0 en caso de que se haya introducido el código qq.

El programa debe quedar así:

salas@318CDCr12: ̃$ ./hexDec7
Introduzca dos caracteres hexadecimales: 22
El valor decimal de 0x22 es 34
Introduzca dos caracteres hexadecimales: 3a
El valor decimal de 0x3a es 58
Introduzca dos caracteres hexadecimales: 3A
El valor decimal de 0x3A es 58
Introduzca dos caracteres hexadecimales: 3G
Error en el segundo valor introducido
Introduzca dos caracteres hexadecimales: -1
Error en el primer valor introducido
Introduzca dos caracteres hexadecimales: tA
Error en el primer valor introducido
Introduzca dos caracteres hexadecimales: qq
salas@318CDCr12: ̃$



Este ejercicio está en el tema de punteros, vamos, que hay que usar punteros en la nueva función, y no sé como meterle mano al problema. Agradecería mucho alguna explicación o modo de actuar.

Gracias de antemano y un saludo!

xiruko

int leeCaracter (char *p1, char *p2)
{
    char a, b;
    int correctos = 0;

    // lees los caracteres y verificas si son correctos como haces en el main
    // supon que tienes una variable llamada 'correctos' que es 1 si estan bien
    // y 0 si no lo estan

    if (correctos)
    {
        // cosas a hacer si son correctos
        // ...

        *p1 = a;  // asignas 'a' al caracter apuntado por p1
        *p2 = b;  // asignas 'b' al caracter apuntado por p2
        return 1;
    }
    else
    {
        // cosas a hacer si no son correctos
        // ...

        return 0;
    }
}


Y en el main tendrías que llamarla así:

char c1, c2;

//...

if (leeCaracter(&c1, &c2) == 1)  // te puedes ahorrar el '== 1'
{
     // caracteres correctos
     // c1 tiene el primer caracter y c2 el segundo
}
else
{
     // caracteres incorrectos
}


En la llamada a la función, lo que haces es pasarle la referencia de las variables a la función; es decir, le pasas su dirección de memoria para poder modificar su valor dentro de la función. En este caso, 'c1' es una variable de tipo 'char', y '&c1' es del tipo puntero a caracter o 'char*', que es lo que ve la función.

Un saludo.