Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ramona98 en 20 Agosto 2013, 12:18 pm



Título: If en macros ?
Publicado por: ramona98 en 20 Agosto 2013, 12:18 pm
Es posible incluir un IF en un macro?

Por ejemplo, quiero hacer un macro que devuelva TRUE si el argumento introducido es un digito decimal, y no se me ocurre otra forma que no sea anadiendo un if en el macro.



por otro lado, es posible que un macro devuelva un char o un string en lugar de de int o float?

gracias y saludos


Título: Re: If en macros ?
Publicado por: amchacon en 20 Agosto 2013, 12:27 pm
Una macro no devuelve nada.

¿Usas C++? Si es así, quizas te interese usar mejor funciones inline con sobrecarga de argumentos:

Código
  1. inline void Ejemplo(float argumento)
  2. {
  3.  // blablabla...
  4. }
  5.  
  6. inline void Ejemplo(int argumento)
  7. {
  8.  // blablabla...
  9. }


Título: Re: If en macros ?
Publicado por: ramona98 en 20 Agosto 2013, 14:30 pm
no te entiendo,
mira, esto es exactamente lo que necesito:

Exercise 10-2: Write a macro is_digit that returns TRUE if its argument is a decimal digit.


yo entiendo que una macro te devuelve un output, pero dicho output no puede ser una string? o que forma existe de que me devuelva un TRUE ?

gracias!


Título: Re: If en macros ?
Publicado por: ivancea96 en 20 Agosto 2013, 14:32 pm
TRUE es igual a 1. es un valor Booleano (1 o 0), verdadero o falso, no una string.


Título: Re: If en macros ?
Publicado por: ramona98 en 20 Agosto 2013, 14:59 pm
gracias,

entonces seria algo asi?

is_digit(x) (if(x == 0 || x == 1 ||..... x== 9)
 {
// aqui se supone que tengo decir que si esto se cumple se devuelva 0 si no 1, pero  :huh:
}



Título: Re: If en macros ?
Publicado por: rir3760 en 20 Agosto 2013, 16:09 pm
La macros no son funciones, son sustituciones de texto y estas ocurren antes de que el texto sea compilado. Para explicarlo mejor cualquiera que haya utilizado un editor de texto (el que sea) sabe como funciona la opción para remplazar. Por ejemplo uno puede sustituir todas las instancias de la palabra "negro" por "blanco":

Texto original:
Código
  1. int muy_negro;
  2. int negro;
  3.  
  4. /* ... */
  5.  
  6. negro++;
  7.  
  8. /* ... */
  9.  
  10. if (negro + negro == muy_negro)
  11.   puts("negro, negro entonces muy negro");
  12.  
  13. /* ... */

Remplazamiento de "negro" por "blanco" resulta en:
Código
  1. int muy_negro;
  2. int blanco;
  3.  
  4. /* ... */
  5.  
  6. blanco++;
  7.  
  8. /* ... */
  9.  
  10. if (blanco + blanco == muy_negro)
  11.   puts("negro, negro entonces muy negro");
  12.  
  13. /* ... */
Este ejemplo sigue la convención de C: las sustituciones no se realizan si la palabra completa no coincide y el texto de las cadenas literales se ignora.

En el caso de las macros con argumentos se realiza la sustitución y donde se indique un argumento formal (definición de la macro) este se sustituye por el argumento actual (uso de la macro):
Código
  1. /* a y b son los argumentos formales */
  2. #define SUMA(a, b) ((a) + (b))
  3.  
  4. /* ... */
  5.  
  6. int x = 1;
  7. int y = 2;
  8. int z;
  9.  
  10. /* ... */
  11.  
  12. /* x y y son los argumentos actuales */
  13. z = SUMA(x, y);

Resulta en:
Código
  1. int x = 1;
  2. int y = 2;
  3. int z;
  4.  
  5. /* ... */
  6.  
  7. z = ((x) + (y));

Para darte una idea de lo que te piden si el objetivo fuera crear un macro que verifique si un carácter es alfabético en minúsculas podríamos utilizar:
Código
  1. #define es_minuscula(ch)  ((ch) >= 'a' && (ch) <= 'z')
  2.  
  3. /* ... */
  4.  
  5. char letra = 'j';
  6.  
  7. if (es_minuscula(letra))
  8.   puts("Es minuscula");
  9. else
  10.   puts("No es minuscula");

Ya que antes de que sea compilado ese texto resulta (debido a la macro) en:
Código
  1. /* ... */
  2.  
  3. char letra = 'j';
  4.  
  5. if (((letra) >= 'a' && (letra) <= 'z'))
  6.   puts("Es minuscula");
  7. else
  8.   puts("No es minuscula");

La macro que debes desarrollar es similar.

Un saludo


Título: Re: If en macros ?
Publicado por: mr.blood en 20 Agosto 2013, 23:16 pm
No se si quieres algo asi...

Código
  1. #include <stdio.h>
  2.  
  3. #define ISDIGIT(character) character>='0' && character<='9'
  4.  
  5. int main()
  6. {
  7. char numero='a';
  8. if(ISDIGIT(numero))
  9. puts("Es un numero\n");
  10. return 0;
  11. }
  12.  

Perfectamente puedes poner un if en un macro, pero por limpieza lo he preferido hacer así.

En realidad cuando yo pongo ISDIGIT el compilador lo reemplaza por character>='0' && character<='9' (character sería un "parámetro") es solo cuestion de dejar el código más limpio.


EDITO:

No había visto el comentario de rir3760, es una muy buena explicación de lo que es una macro.

Sa1uDoS


Título: Re: If en macros ?
Publicado por: ramona98 en 21 Agosto 2013, 09:39 am
perfecto!! muchas gracias a los dos :D

Desconocia que se pudieran ordenar asi " character>='0' && character<='9' " ... me queda mucho  por aprender aun