Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jamatbar en 13 Enero 2014, 18:26 pm



Título: Perdido al crear una función con punteros
Publicado por: jamatbar en 13 Enero 2014, 18:26 pm
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:

Código:
#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!


Título: Re: Perdido al crear una función con punteros
Publicado por: xiruko en 13 Enero 2014, 21:09 pm
Código
  1. int leeCaracter (char *p1, char *p2)
  2. {
  3.    char a, b;
  4.    int correctos = 0;
  5.  
  6.    // lees los caracteres y verificas si son correctos como haces en el main
  7.    // supon que tienes una variable llamada 'correctos' que es 1 si estan bien
  8.    // y 0 si no lo estan
  9.  
  10.    if (correctos)
  11.    {
  12.        // cosas a hacer si son correctos
  13.        // ...
  14.  
  15.        *p1 = a;  // asignas 'a' al caracter apuntado por p1
  16.        *p2 = b;  // asignas 'b' al caracter apuntado por p2
  17.        return 1;
  18.    }
  19.    else
  20.    {
  21.        // cosas a hacer si no son correctos
  22.        // ...
  23.  
  24.        return 0;
  25.    }
  26. }

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

Código
  1. char c1, c2;
  2.  
  3. //...
  4.  
  5. if (leeCaracter(&c1, &c2) == 1)  // te puedes ahorrar el '== 1'
  6. {
  7.     // caracteres correctos
  8.     // c1 tiene el primer caracter y c2 el segundo
  9. }
  10. else
  11. {
  12.     // caracteres incorrectos
  13. }

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.