C/Visual C - Como usar | para opciones de una funcion

 
Vista:

Como usar | para opciones de una funcion

Publicado por harold puentes (12 intervenciones) el 13/06/2007 15:51:44
Que tal maestros del C

Si alguno de ustedes sabe como se crea un funcion que pueda recibir y validar diferentes opciones separadas por |, por ejemplo asi como funciona un MessageBox del API de windows que para darle las opciones para que muestre los botones si no cancelar, uno le envia MB_YESNOCANCEL | MB_ICONEXCLAMATION | MB_DEFBUTTON3 ,

enton seria algo si como

enum opciones{
OP1=2,
OP2=4,
OP3=8

}

/*declaracion */
int MiFuncion( opciones misop );

/* llamado*/

MiFuncion( OP1 | OP2 | OP3 );

/*Implementacion*/
int MiFuncion( opciones misop ){

????
????
????
//Como seria en esta funcion??
}

Si alguno ha hecho una funcion de este tipo o sabe como hacerlo, le agradeceria mucho que me compartiera el conocimiento


Gracias ;-)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Como usar | para opciones de una funcion

Publicado por josema (35 intervenciones) el 13/06/2007 17:03:46
Puedes hacer una comparación bit a bit.
Recuerda que la operación OR no es más que una suma, por eso es necesario que cada uno de los valores de las distintas opciones sean potencias de 2.

int funcion ( int nParametro)
{
if ( nParametro && OP1 == OP1 )
{ // se puso el parametro 1
}
if ( nParametro && OP2 == OP2 )
{ // se puso el parametro 2
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como usar | para opciones de una funcion

Publicado por fernando.gomez (1603 intervenciones) el 13/06/2007 17:16:38
Er... de hecho la versión correcta sería con &, no con &&...

nt funcion ( int nParametro)
{
if ( nParametro & OP1)
{ // se puso el parametro 1
}
if ( nParametro & OP2)
{ // se puso el parametro 2
}
}

Además no es necesario que iguales con OP1 u OP2 ya que con el & se resuelve esto (porque OP1 y OP2 van a tener todos los otros bits a cero.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

La respuesta

Publicado por Nelek (816 intervenciones) el 14/06/2007 15:07:41
Hola,

ya te han puesto un ejemplo y una correccion a dicho ejemplo. Pero la respuesta que pedias es la siguiente:

Cuando una funcion puede o necesita tener mas de un parametro, pero dichos parametros se pueden relacionar entre ellos o ir aislados es cuando se usa dicho tipo de funciones. Por ejemplo, para poner los flags/estilos de creacion de una ventana (WS_CAPTION | WS_CHILD | ...) eso los combinaria y daria un valor entero ya que los flags o estilos son constantes declaradas valor potencia de dos. Esto se hace para que cada uno de los flags que vayan a ser utilzados (o no) tenga un UNICO bit a uno.

Es decir:
#define PAR1 0x0001
#define PAR2 0x0010
#define PAR3 0x0100
#define PAR4 0x1000

con ello se tiene los 4 parametros que pueden combinarse para ejecutar o saltarse ciertas particularidades de tu funcion en paralelo.

void funcion (int COMB_PARAM)
{
if (COMB_PARAM & PAR1)
funcion_particular_parametro_1 ();

if (COMB_PARAM & PAR2)
funcion_particular_parametro_2 ();

if (COMB_PARAM & PAR3)
funcion_particular_parametro_3 ();

if (COMB_PARAM & PAR4)
funcion_particular_parametro_4 ();

if (!COMB_PARAM)
AfxMessageBox ("no elegiste nada");
}

y asi se ejecutan las diferentes funciones particulares o trozos de codigo segun se haya puesto la combinacion de parametros.

funcion (PAR1 | PAR3); //ejecutaria los pasos 1 y 3
funcion (0); //Te saldria el mensaje de "no seleccion"
funcion (PAR1 | PAR2 | PAR4); //Ejecutaria las funciones 1,2, 4

Espero que te lo haya aclarado un poco
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:La respuesta

Publicado por Harold Puentes (12 intervenciones) el 14/06/2007 15:46:13
Muchisimas gracias, han sido de gran ayuda, muy amables

Chao
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:La respuesta

Publicado por fernando.gomez (1603 intervenciones) el 14/06/2007 17:33:47
Mmm...

Es decir:
#define PAR1 0x0001 // 0000000000001
#define PAR2 0x0010 // 0000000010000
#define PAR3 0x0100 // 0000100000000
#define PAR4 0x1000 // 1000000000000

es un desperdicio de bits. El ejemplo que ponía Harold me parece mejor:

Es decir:
#define PAR1 1 // 00001
#define PAR2 2 // 00010
#define PAR3 4 // 00100
#define PAR4 8 // 01000

etc...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como usar | para opciones de una funcion

Publicado por Harold Puentes (12 intervenciones) el 14/06/2007 15:47:23
Muchisimas gracias han sido de gran ayuda,

gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar