Volver a llamar a la misma función dentro de ella

Hola a todos, estoy haciendo un menu en un lcd....tengo una funcion que muestra el menu principal y con un encoder rotativo recorre las opciones, cuando el switch "ok" es pulsado muestra un submenu.
Para no hacer una funcion por cada menu o submenu yo quiero usar la misma funcion para todo y asi no tener un codigo extenso...modifique la funcion y pase valores para que sea universal.
La pregunta es si puedo volver a llamar a la funcion dentro de la misma, sabiendo que hay una variable local llamada "idxMenu"... por lo que tengo entendido es que las variables locales se destruyen cuando finaliza la funcion pero en este ejemplo que dejo aca esa variable se crea nuevamente cuando llamo devuelta a la misma funcion.
Hice una prueba y funciona pero no tengo en claro que es lo que realmente pasa con esa variable

Cogido de ejemplo, faltan algunas cosas pero la idea esta clara
Muchas gracias saludos

#define MENU_PRINCIPAL    0

String text_Menu_Principal[] = {
    "Opcion_1",
    "Salir"
};
const byte item_Menu_Principal = COUNT(text_Menu_Principal);     // Numero de items/opciones del menu principal


#define OPCION_1   1

String text_Opcion_1[] = {
    "Opcion_1_1",
    "Salir"
};
const byte item_Opcion_1 = COUNT(text_Opcion_1);     // Numero de items/opciones del menu opcion_1


#define OPCION_1_1   2

String text_Opcion_1_1[] = {
    "Valor_1",
    "Valor_2",
    "Salir"
};
const byte item_Opcion_1_1 = COUNT(text_Opcion_1_1);     // Numero de items/opciones del menu opcion_1_1

void setup()
{
}


void loop()
{
  openMenu( text_Menu_Principal, item_Menu_Principal, MENU_PRINCIPAL); 
}


void openMenu( String *txMenu, byte iMenu, byte Menu )
{
    byte idxMenu       = 0;
    boolean exitMenu   = false;

    lcd.clear();
 
    while( !exitMenu )
    {
        btnPressed = readButtons(); //lee estado de los botones
 
        if( btnPressed == Button::Up && idxMenu-1 >= 0 )
        {
            idxMenu--;  //decrementa posición de cursor
        }
        else if( btnPressed == Button::Down && idxMenu+1 < iMenu )
        {
            idxMenu++; //incrementa posición de cursor
        }
        else if( btnPressed == Button::Ok )
        {

           if( Menu == MENU_PRINCIPAL )
           {
              switch( idxMenu )
              {
                  case 0: openMenu( text_Opcion_1, item_Opcion_1, OPCION_1); break;
                  case 1: exitMenu = true;                                  break; //Salir
               }
            }

           else  if( Menu == OPCION_1 )
           {
              switch( idxMenu )
              {
                  case 0: openMenu( text_Opcion_1_1, item_Opcion_1_1, OPCION_1_1); break;
                  case 1: exitMenu = true;                                         break; //Salir
              }
            } 
        }
     
    }
    lcd.clear();
}

Por qué no pones un par de Serial.print() y de esa forma te respondes solo? Es la manera que tenemos de hacer algún debug en Arduino.
No sabía como se llamaba la propiedad pero TonyDiana me ha dicho que es recursividad.
Lo que haces esta permitido en C++ de modo que no has cometido error.
El mismo concepto se usa para calcular por ejemplo el factorial de un número, una rutina que se llama a si misma.
Dejaré a Tony que lo explique con mas profundidad. Pero no estas cometiendo ninguna falta. En tu caso con cada llamado las variables locales toman nuevos valores y si, se destruyen cuando dicha llamado termina, pero la anterior o de nivel mas alto continúa hasta que le ocurra lo mismo.
Algo que comprobarías con el Serial.print.

HOLA

Mirate estos tutoriales de recursividad en C++

https://robologs.net/2015/03/12/tutorial-de-recursividad-en-c/
C Con Clase | Curso C++ (cap24).

La idea no es mala, lo que debes hacer si vas a usar eso es abstraer cada elemento, aunque es muy sencillo que se más útil un objeto especializado aunque sólo deba tener una instancia, de esa manera puedes tener varias funciones especializadas específicas.

No te puedo ayudar mucho más si no tomo exáctamente tu código, el cual parece además montado como abstracto para explicar, lo cual es un poco complejo de analizar.

Además estoy medio sin compu, pero mejor si haces preguntas más específicas a problemas concretos.

Yo prefiero el objeto a una única función especializada porque es más flexible

De menús resueltos en C++ hay miles de post en múltiples sitios, mira este sencillo

https://algoritmosyalgomas.com/plantilla-de-un-menu-de-opciones-en-c/

Hola, muchas gracias a los dos por responder....Si, no tuve en cuenta de poner Serial.print() y ver los valores que toma esa variable local.
Hasta ahora hice una parte del programa, lo subi a un arduino mega y funciono, pero queria asegurarme que esta forma de llamar a la funcion sea correcta y no tener un problema a futuro que me obligue a rehacer el codigo (la cual ya me paso por no tener en cuenta que tipos de valores queria modificar en el menu)
Voy a probar con Serial.print() ....

Recien vi el tutorial de recursividad y me despejo varias dudas muchas gracias por la info.
Disculpen pero el codigo que estoy haciendo no lo puse aca de ejemplo porque hice varias modificaciones y tengo que limpiarlo un poco para que sea entendible...me parecia mas comodo hacer un ejemplo nuevo para que vean mi problema.

Nuevamente muchas gracias, voy a seguir con el menu y en cuanto pueda subo algo mas completo
Saludos

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.