es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No es posible llamar a una función con parámetros utilizando ArduinoMenu.

Estoy intentando imprimir valores cuando se utiliza la macro Toggle de neu-rah/ArduinoMenu.
Si no uso ningún parámetro de entrada, funciona como debería:

void storeConfigValue(){
     Serial.println("");
     Serial.println("-------------");
     Serial.println("valor de config:");
}

TOGGLE(conf, Config, "Config ", doNothing, noEvent, wrapStyle 
   , VALUE("1x pre", HIGH, storeConfigValue,noEvent)
   , VALUE("2x pre", LOW, storeConfigValue,noEvent)
);

Pero cuando intento pasar un parámetro, da error:

“void” no se ignora como debería

El código de error es el siguiente:

void storeConfigValue(uint8_t a){
   Serial.println("");
   Serial.println("-------------");
   Serial.println("valor de config:");
   Serial.println(a);
}

TOGGLE(conf, Config, "Config ", doNothing, noEvent, wrapStyle 
   , VALUE("val1", HIGH, storeConfigValue(1),noEvent)
   , VALUE("val2", LOW, storeConfigValue(2),noEvent)
);

¿Podrías sugerir una corrección por favor?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema en el código es que la llamada a la función storeConfigValue(1) y storeConfigValue(2) se está ejecutando durante la creación del menú en lugar de ser desencadenada por la acción del interruptor. Para solucionar este problema, puedes utilizar funciones lambda para retrasar la ejecución de las llamadas a la función.

    Aquí tienes un fragmento de código actualizado:

    void storeConfigValue(uint8_t a){
       Serial.println("");
       Serial.println("-------------");
       Serial.println("valor de configuración:");
       Serial.println(a);
    }
    
    TOGGLE(conf, Config, "Configuración ", doNothing, noEvent, wrapStyle 
       , VALUE("val1", HIGH, []{storeConfigValue(1);},noEvent)
       , VALUE("val2", LOW, []{storeConfigValue(2);},noEvent)
    );
    

    En este código, en lugar de llamar directamente a la función storeConfigValue, utilizamos una función lambda []{storeConfigValue(1);} y []{storeConfigValue(2);} para retrasar la ejecución de las llamadas a la función hasta que se active la acción del interruptor.

Comments are closed.