Comprobaciones condicionales para diferentes variables

Tengo una función que establece una variable basada en otra variable.

if(!button_x.on)
   button_x.on = 1;
if(!button_y.on)
   button_y.on = 1;
if(!button_z.on)
   button_z.on = 1;
.
.
.

Si es x, y, z, …. se determina solo en tiempo de ejecución. Tener múltiples condiciones de este tipo para varios (100) casos diferentes no se ve bien. ¿Hay una mejor manera de hacer esto en C?


EDITAR: Debería haber enmarcado mejor mi ejemplo anterior.

if (!structureA.visited)            
    visit_structureA(); // does some operation
if (!structureB.visited)            
visit_structureB();
if (!structureC.visited)            
visit_structureC();

. . .

El número de estructuras y el nombre de la estructura no se conoce en tiempo de compilación. Pero los nombres de las estructuras siguen un patrón específico que se muestra arriba. Solo se conoce en tiempo de ejecución. Intenté usar macros algo como:

#define VISIT(str) \
    if (!structure##str.visited) \
        visit_structure##str();

//In the function:
// str = 'known at runtime' 
  VISIT(str);

Pero esto no funcionaría por la razón obvia de que las directivas del preprocesador se reemplazan durante el tiempo de compilación y no durante el tiempo de ejecución. No estoy seguro si hay una mejor manera para esto?

preguntado el 03 de mayo de 12 a las 22:05

¿Necesita alternar entre los estados? es decir, si está ENCENDIDO apáguelo y viceversa. -

2 Respuestas

En tu ejemplo estableces un valor de variable de acuerdo a la misma variable, no otra, si este es el caso, y quieres cambiarlo de 0 a 1 y viceversa, puedes hacerlo sin condición:

button_x.on = !button_x.on;

Si tiene muchos de ellos con la misma idea de comportamiento, considere usar array e iterarlo.

contestado el 03 de mayo de 12 a las 22:05

Habría dicho exactamente esto si OP estuviera de acuerdo con mi comentario :) - Mahesh

En C, la siguiente condición:

if (!x)
  x = 1;

es equivalente a:

x = 1;

si la variable es booleana (encendido/apagado), lo cual supongo que es el caso si estamos hablando de botones.

contestado el 03 de mayo de 12 a las 22:05

+1, el nombre del miembro de la estructura parece implicar que el valor es booleano y, en ese caso, la condición es una sobrecarga. Si el valor no es booleano, el OP debe precisarlo y puede pensar en cambiar el nombre del miembro de la estructura a un nombre menos confuso. - Guau

@BinyaminSharet: vea mi clara suposición de que las variables eran booleanas (como suelen ser los botones). - nathan wiebe

@NathanWiebe: lo siento, pero no me quedó claro cuando lo puse en rojo. mi error :-/ - MByD

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.