Estoy intentando hacer un ejercicio sencillo usando la instrucción GOTO para mostrar su "utilidad" prácita. El ejemplo es sencillo, está basado en un ejemplo que encontré en una página llamada stackoverflow, de programación, y sirve simplemente para sustituir lo que serían 10 sentencias IF o un SWITCH, y hacer que tarde lo mismo en acceder al código del IF, independientemente de si es el primer IF o el noveno tras pasar por ocho ELSE IF el que se va a ejecutar.
Creo una matriz con punteros void para guardar las direcciones de los saltos que haré mas adelante. Llamo a la función Actualizar() y los inicializo, pongo la variable situacion a 0 y entro en loop()
Tras llamar a Hacer_salto(), desde Hacer_salto() se realiza un goto *saltos[situacion], aquí se actualizaría la variable, y se hace el return, que sustituye al return de Hacer_salto(), volviendo a loop() y se haría Serial.println( "Volvemos de Hacer_salto()...." );
No entiendo por que obtengo este resultado:
Llamamos a Actualizar() para inicializar los saltos.
Ponemos situacion=0
Salimos de Setup...
Llamamos a Hacer_salto()....
Entra en Hacer_salto()
Ponemos situacion=0
Salimos de Setup...
Llamamos a Hacer_salto()....
Entra en Hacer_salto()
Ponemos situacion=0
Salimos de Setup...
Llamamos a Hacer_salto()....
Entra en Hacer_salto()
Ponemos situacion=0
Salimos de Setup...
Llamamos a Hacer_salto()....
Entra en Hacer_salto()
......
El programa es este, sencillo, pero no doy con el porque se hace un bucle, no se resetea, pero hace mal los saltos y se queda haciendo siempre lo mismo, como si hiciera dos return, o algo así, no se, no veo donde se me vuelve loca la pila.
void *saltos[10];
int situacion;
void setup() {
Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT);
Serial.println( "Llamamos a Actualizar() para inicializar los saltos." );
Actualizar(); Serial.println( "Ponemos situacion=0" );
situacion = 0; Serial.println( "Salimos de Setup..." );
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println( "Llamamos a Hacer_salto()...." );
Hacer_salto();
Serial.println( "Volvemos de Hacer_salto()...." );
digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000);
Serial.print( " Situación=" );
Serial.println( situacion );
}
void Hacer_salto()
{
Serial.println( " Entra en Hacer_salto()" );
goto *saltos[ situacion ];
return;
}
void Actualizar()
{
saltos[0] = &&etiqueta00; saltos[1] = &&etiqueta01; saltos[2] = &&etiqueta02; saltos[3] = &&etiqueta03; saltos[4] = &&etiqueta04;
saltos[5] = &&etiqueta05; saltos[6] = &&etiqueta06; saltos[7] = &&etiqueta07; saltos[8] = &&etiqueta08; saltos[9] = &&etiqueta09;
// saltos[0] = &etiqueta00; saltos[1] = &etiqueta01; saltos[2] = &etiqueta02; saltos[3] = &etiqueta03; saltos[4] = &etiqueta04;
// saltos[5] = &etiqueta05; saltos[6] = &etiqueta06; saltos[7] = &etiqueta07; saltos[8] = &etiqueta08; saltos[9] = &etiqueta09;
return;
etiqueta00: Serial.println( " Entra en Actualizar() al 0" ); situacion = 1; return;
etiqueta01: Serial.println( " Entra en Actualizar() al 1" ); situacion = 2; return;
etiqueta02: Serial.println( " Entra en Actualizar() al 2" ); situacion = 3; return;
etiqueta03: Serial.println( " Entra en Actualizar() al 3" ); situacion = 4; return;
etiqueta04: Serial.println( " Entra en Actualizar() al 4" ); situacion = 5; return;
etiqueta05: Serial.println( " Entra en Actualizar() al 5" ); situacion = 6; return;
etiqueta06: Serial.println( " Entra en Actualizar() al 6" ); situacion = 7; return;
etiqueta07: Serial.println( " Entra en Actualizar() al 7" ); situacion = 8; return;
etiqueta08: Serial.println( " Entra en Actualizar() al 8" ); situacion = 9; return;
etiqueta09: Serial.println( " Entra en Actualizar() al 9" ); situacion = 0; return;
}
/*
https://stackoverflow.com/questions/14268325/exposing-goto-labels-to-symbol-table
int main () {
void *ret_p = &&ret;
printf("ret: %p\n", ret_p);
goto *ret_p;
return 1;
ret:
asm("RET:")
return 0;
}
*/