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.

Parámetros de salida con matrices en una función con Arduino y C++

Tengo un problema con la inicialización con varios parámetros en mi función.
Funciona si he creado un arreglo int params [] = {...}. Sin embargo, no funciona si quiero escribir los parámetros directamente en la función.

declaración (en el .h)

void phase_an(int led[]);

en el .cpp

void RS_Schaltung::phase_an(int led[])
{
for (size_t i = 0; i < LEN(led); i++) {
digitalWrite(led[i], HIGH);
}
}

si intento hacerlo de esta manera, no funcionará. Me gustaría que fuera así. Pero no pude encontrar nada al respecto en internet. …:
en el Arduino sketch:

RS.phase_an(RS.ampelRot, RS.ampelGelb, ..... ); <--- ¿hay alguna forma de hacerlo así?

lo que me sorprende es que funcione de esta manera:

int p_an [5] = {RS.ampelRot, RS.ampelGelb, RS.ampelGruen, RS.rot, RS.gelb};
...................
RS.phase_an (p_an);

¿Alguien tiene alguna sugerencia?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema que estás enfrentando se relaciona con pasar parámetros a tu función phase_an(). Has definido la función para tomar una matriz de enteros, pero estás tratando de pasar múltiples enteros directamente a la función.

    Para pasar múltiples enteros directamente a la función, puedes utilizar la característica de plantilla variádica de C++11. Aquí tienes un ejemplo de cómo puedes modificar tu función para aceptar argumentos de longitud variable:

    declaración (en el archivo .h)

    template<typename... args="">
    void phase_an(Args... leds);
    

    en el archivo .cpp

    template<typename... args="">
    void RS_Schaltung::phase_an(Args... leds)
    {
      int arr[] = {leds...};
      for (size_t i = 0; i < sizeof...(leds); i++) {
        digitalWrite(arr[i], HIGH);
      }
    }
    

    Ahora, puedes llamar a la función con cualquier cantidad de enteros directamente:

    RS.phase_an(RS.ampelRot, RS.ampelGelb, RS.ampelGruen, RS.rot, RS.gelb);
    

    Esto pasará la lista de argumentos de longitud variable a la función, la cual luego la convertirá en una matriz y la recorrerá para establecer los pines correspondientes en HIGH.

    Ten en cuenta que para usar plantillas variádicas, necesitas un compilador compatible con C++11.</typename…></typename…>

Comments are closed.