Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Desiresportal en 1 Junio 2016, 13:10 pm



Título: Funciones con argumentos OR: ¿Como?
Publicado por: Desiresportal en 1 Junio 2016, 13:10 pm
¿Cual es el codigo necesario para disponer de una funcion que lee varios argumentos? Tengo entendido que se puede llamar a funciones como "glutInitDisplayMode()" y que se pueden pasar varios argumentos separados por "|".

He buscado sobre el tema y he visto que en la definicion de la funcion el argumento es "unsigned int mode", pero no he encontrado nada mas. ¿Como hace la funcion para separar los argumentos que se le pasan? ¿Tiene algo que ver que los valores que recibe sean potencias de 2? (0,1,2,4,8,16,32,64,...)

No me urge, pero me gustaría entenderlo por si en un futuro me ayuda a reducir un codigo extenso.


Título: Re: Funciones con argumentos OR: ¿Como?
Publicado por: class_OpenGL en 1 Junio 2016, 14:34 pm
Nota aclaratoria antes de la explicación: un número al que le sigue una b, significa que está representado en binario (es para aclarar, no es porque sea así)

Lo que hace el operador | no es separar argumenots, sino que los combina sumando bit a bit. Por ejemplo, si haces 10101b | 11100b obtendrás como resultado 11101b. Básicamente, sumas bit a bit. Entonces, ¿en qué se diferencia de una suma normal? la diferencia reside en que si sumas dos bits con valor 1 no habrá carry. Es decir, si sumáramos 011b + 001b obtendríamos lo siguiente:

Código:
 011b
+001b
____
100b

Sin embargo, si aplicamos el operador | obtendríamos

Código:
 011b
|001b
____
011b

Entonces, una de las utilidades de este operador es el que mencionas. Lo que hace es asignar un bit de los 32 que tiene un unsigned int a cada bandera.

Por ejemplo, a GLUT_RGBA podríamos asignarle el primer bit, a GLUT_RGB el segundo bit, a GLUT_INDEX el tercer bit, a GLUT_SINGLE el cuarto bit...

Entonces
Código:
GLUT_RGBA   = 00000000000000000000000000000001b
GLUT_RGB    = 00000000000000000000000000000010b
GLUT_INDEX  = 00000000000000000000000000000100b
GLUT_SINGLE = 00000000000000000000000000001000b

Por lo tanto, al hacer GLUT_RGB | GLUT_INDEX, lo que haces es dar como resultado un entero con los bits de GLUT_RGBA y GLUT_INDEX activados, y así GLUT puede saber qué banderas has activado. Lo malo es que solo puedes pasar como máximo 32 banderas, puesto que un entero suele ocupar 4 bytes (32 bits).