TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: IngRandall en 09 de Abril de 2012, 18:34:37

Título: GOTO en C
Publicado por: IngRandall en 09 de Abril de 2012, 18:34:37
Hola, he estado mirando por casualidad y muchas veces dicen que no deben utilizar la función "goto" cuando están programando PIC en C, yo quiero saber el por que no se debe utilizar.
Título: Re: GOTO en C
Publicado por: Suky en 09 de Abril de 2012, 18:39:54
Es más complicado de entender la secuencia. Seguramente si lo piensas un poco mejor te sale realizarlo sin utilizar el goto  ;-)
Título: Re: GOTO en C
Publicado por: IngRandall en 09 de Abril de 2012, 18:43:20
Osea, yo no lo utilizo, nunca en C lo he utilizado, solo quiero saber el por que no se debe utilizar, gracias.
Título: Re: GOTO en C
Publicado por: MGLSOFT en 09 de Abril de 2012, 18:52:01
En lenguaje C el Goto es un insulto a los programadores experimentados.
Es un lenguaje tan rico en formas de manejar cada situación, que ir a un goto, que son saltos sin control de retorno, en realidad es una cosa bastante loca.
Nadie dice que no se puede usar, solamente te amenazaran de muerte si lo haces... :D :D :D :D

Para suavizar la cosa, dinos donde usarías un Goto y que intentarías hacer con el y te propondremos al menos dos formas de hacerlo usando las instrucciones de control de interacción con retorno que deberías usar para hacerlo mejor y bien...
Título: Re: GOTO en C
Publicado por: IngRandall en 09 de Abril de 2012, 18:59:33
 :D :D :D Osea como tal se puede, pero no se debe ya que seria "feo" la forma de programacion con esta funcion habiendo tantas maneras tan diferentes de hacerlo y mucho mejores... bien, gracias por la respuesta, salimos de un debate aca en mi trabajo, saludos desde Barranquilla Colombia  ((:-)) ((:-)) ((:-))
Título: Re: GOTO en C
Publicado por: Suky en 09 de Abril de 2012, 19:03:15
Claro, si nadie mira tu código todo bien, pero si no que no se sepa quién lo hizo!  :P :D :D
Título: Re: GOTO en C
Publicado por: jukinch en 09 de Abril de 2012, 19:40:56
A la programación con goto se le llama programación spaghetti!. Porque tu codigo queda como un plato de fideos. Y se complica seguir el camino que recorre un fideo.
El problema es básicamente de interpretación. Seguramente te vas a complicar al depurar errores usando goto. Porque el codigo saltará de una parte a otra y de esa a otra y así sucesivamente. Y para controlar donde cometiste un error tenés que estar controlando cada salto dentro de tu programa. Y cuando el codigo se hace bastante extenso es más complicado seguir las iteraciones. etc. etc.
Además en la programación de microncontroladores los labels: deben estar dentro de main. No podés poner labels fuera de main. Y eso hace que el codigo no entre en una sección de memoria. Y no podrás trozarlo como lo harías con funciones.
Así que al menos en los pics prohibido usar el GOTO! ;-)

Título: Re: GOTO en C
Publicado por: el_loco en 09 de Abril de 2012, 21:50:44
porque C es un lenguaje estructurado
Título: Re: GOTO en C
Publicado por: PalitroqueZ en 12 de Abril de 2012, 21:02:21
Hola, he estado mirando por casualidad y muchas veces dicen que no deben utilizar la función "goto" cuando están programando PIC en C, yo quiero saber el por que no se debe utilizar.

claro que lo puedes usar!!! si no se pudiera usar, entonces el compilador no lo soportaría.

yo también me tropecé con el dilema del goto en lenguajes estructurados en mis comienzos, y lo que puedo decir (mi opinión personal), es que cuando dejas de pensar en asm, dejas de usar el goto


Título: Re: GOTO en C
Publicado por: IngRandall en 13 de Abril de 2012, 09:36:59
Hola PalitroqueZ, yo no hable de poder si no de deber, son dos cosas distintas.
Título: Re: GOTO en C
Publicado por: jukinch en 13 de Abril de 2012, 09:54:05
El tema a tener en cuenta al menos en los microcontroladores, es el problema del consumo de segmentos de memoria rom mediante el uso de labels. Como todos los labels deben estar dentro de la función main llega un momento en que no se puede seguir programando. Y llega el error: Memoria rom insuficiente - Out of ROM, A segment or the program is too large.
cito un ejemplo que me ocurrió en carne propia.
http://www.todopic.com.ar/foros/index.php?topic=29379.0
          Saludos.
              Jukinch
Título: Re: GOTO en C
Publicado por: PalitroqueZ en 13 de Abril de 2012, 19:35:11
Hola PalitroqueZ, yo no hable de poder si no de deber, son dos cosas distintas.

ah ok perdón entonces.

una respuesta mas acertada a tu pregunta sería la siguiente,

no debes utilizar el goto en C, puesto que no conoces el concepto de goto en C, esa es la razón de porque "no debes".....

no conocer implica "no deber", si no conoces, "no debes" utilizarlo.

Título: Re: GOTO en C
Publicado por: MerLiNz en 13 de Abril de 2012, 20:49:19
no se debe usar porque no es la forma de trabajar con C, pero nada mas.
Título: Re: GOTO en C
Publicado por: Diego E. en 14 de Abril de 2012, 13:50:33
Hola amigos, yo utilizo el GOTO en algunas ocasiones porque lo veo como la mejor alternativa en ese caso particular, igual no creo que esta función sea tan insegura además de ser nativa del C ANSI, un ejemplo: como me recomiendan ustedes resolver la siguiente función sin GOTO:

short final_ciclos()
{
   ciclos_uni_a++;
   if(ciclos_uni_a < 10) {goto   compare;}
   ciclos_uni_a = 0;
   
   ciclos_dec_a++;
   if(ciclos_dec_a < 10) {goto   compare;}
   ciclos_dec_a = 0;
   
   ciclos_cen_a++;
   if(ciclos_cen_a < 10) {goto   compare;}
   ciclos_cen_a = 0;
   
   ciclos_mil_a++;
   if(ciclos_mil_a < 10) {goto   compare;}
   ciclos_mil_a = 0;   
   
   compare:
   
   if(ciclos_mil_a == ciclos_mil && ciclos_cen_a == ciclos_cen &&
      ciclos_dec_a == ciclos_dec && ciclos_uni_a == ciclos_uni) {return(true);}
   else {return(false);}
}

Saludos.
Título: Re: GOTO en C
Publicado por: MerLiNz en 14 de Abril de 2012, 16:39:51
facil y sencillo xd

short final_ciclos() {
while(1) {
ciclos_uni_a++;
if(ciclos_uni_a<10) break;
ciclos_uni_a=0;

ciclos_dec_a++;
if(ciclos_dec_a<10) break;
ciclos_dec_a=0;

ciclos_cen_a++;
if(ciclos_cen_a<10) break;
ciclos_cen_a=0;

ciclos_mil_a++;
if(ciclos_mil_a<10) break;
ciclos_mil_a=0;

break;
}

return((ciclos_mil_a == ciclos_mil && ciclos_cen_a == ciclos_cen &&  ciclos_dec_a == ciclos_dec && ciclos_uni_a == ciclos_uni));
}
Título: Re: GOTO en C
Publicado por: Picuino en 14 de Abril de 2012, 18:44:09
Hola amigos, yo utilizo el GOTO en algunas ocasiones porque lo veo como la mejor alternativa en ese caso particular, igual no creo que esta función sea tan insegura además de ser nativa del C ANSI, un ejemplo: como me recomiendan ustedes resolver la siguiente función sin GOTO:

short final_ciclos()
{
   ciclos_uni_a++;
   if(ciclos_uni_a < 10) {goto   compare;}
   ciclos_uni_a = 0;
   
   ciclos_dec_a++;
   if(ciclos_dec_a < 10) {goto   compare;}
   ciclos_dec_a = 0;
   
   ciclos_cen_a++;
   if(ciclos_cen_a < 10) {goto   compare;}
   ciclos_cen_a = 0;
   
   ciclos_mil_a++;
   if(ciclos_mil_a < 10) {goto   compare;}
   ciclos_mil_a = 0;   
   
   compare:
   
   if(ciclos_mil_a == ciclos_mil && ciclos_cen_a == ciclos_cen &&
      ciclos_dec_a == ciclos_dec && ciclos_uni_a == ciclos_uni) {return(true);}
   else {return(false);}
}

Saludos.

Otro ejemplo:

Código: [Seleccionar]
short final_ciclos()
{
   ciclos_uni_a++;
   if(ciclos_uni_a >= 10) {
      ciclos_uni_a = 0;
      ciclos_dec_a++;
      if(ciclos_dec_a >= 10) {
         ciclos_dec_a = 0;
         ciclos_cen_a++;
         if(ciclos_cen_a >= 10) {
            ciclos_cen_a = 0;
            ciclos_mil_a++;
            if(ciclos_mil_a >= 10) {
               ciclos_mil_a = 0;
            }
         }
      }
   }    
  
   if (ciclos_mil_a == ciclos_mil &&
       ciclos_cen_a == ciclos_cen &&
       ciclos_dec_a == ciclos_dec &&
       ciclos_uni_a == ciclos_uni) {
          return(true);
   }
   else {
          return(false);
   }
}
Título: Re: GOTO en C
Publicado por: Picuino en 14 de Abril de 2012, 19:06:49
El goto es como el ácido sulfúrico, que es indispensable en la industria, pero muy peligroso por su gran potencia.

Por esa razón lo meten en una botella de seguridad para que sea menos peligroso manejarlo.

Los recipientes de seguridad del goto se llaman en C: continue, break, while(1) {   }, if {..  } else, switch, etc.

En otros lenguajes hay instrucciones de manejo de excepciones (Traps) como el try:  ...   default: de Python

Saludos.
Título: Re: GOTO en C
Publicado por: Picuino en 14 de Abril de 2012, 19:17:20
Cuándo utilizar goto en C y C++
http://stackoverflow.com/questions/245742/examples-of-good-gotos-in-c-or-c

Saludos.
Título: Re: GOTO en C
Publicado por: Picuino en 14 de Abril de 2012, 19:25:08
Programación estructurada usando goto:
http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf

Saludos.

Editado:
del experto en programación Donald Knuth:
http://es.wikipedia.org/wiki/Donald_Knuth
Título: Re: GOTO en C
Publicado por: MerLiNz en 14 de Abril de 2012, 19:26:42
Picuino ese codigo que has puesto es el primero que pense, pero pense que seria un tocho asi que puse el while para hacerlo mas parecido.

De todas formas como digo se puede usar sin ninguna repercusion ni problema, es mas, los break; que he puesto yo al compilarlo en ASM se convierten en un GOTO.

Pero el goto no es lo correcto en el C, solo porque no es la forma correcta de estructurar el codigo. Es como mover el cafe con un tenedor, poder se puede, pero teniendo una cuchara pues xD
Título: Re: GOTO en C
Publicado por: Picuino en 14 de Abril de 2012, 19:31:19
Hola MerLiNz, mi código sólo era otra forma de evitar el goto, como tu ejemplo.
La verdad es que yo no utilizo goto en C, ni me ha hecho falta. Siempre he buscado otras maneras de resolver el problema. Intento evitarlo porque conozco los problemas que me puede dar (comencé programando en basic simple no estructurado) y huyo del goto como del lobo.

Sin embargo siempre me he preguntado por qué está en el c y si habrá formas útiles de usarlo.

Saludos.
Título: Re: GOTO en C
Publicado por: MGLSOFT en 14 de Abril de 2012, 21:11:23
Si encuentran alguna aplicacion que use el modo sleep del micro, a veces e visto que ponen un goto a la instruccion sleep.
Supongo que es una forma de asegurarse que entre en ese modo, ya que a la primer vez que se llama la instruccion el Pic deberia entrar en ese modo, salvo que sea de sueño liviano !!  :D :D
Título: Re: GOTO en C
Publicado por: Diego E. en 15 de Abril de 2012, 00:27:37
Hola amigos, revisé el ejemplo de MerLiNz y Picuino y ambos funcionan correctamente; pero igual el compilador convierte los Break en Goto quizá porque la lógica es con Goto y asm no tiene otra alternativa.

Es más inicialmente pensé hacerlo con if anidados pero me pareció más organizado a la vista utilizando goto.

Saludos.
Título: Re: GOTO en C
Publicado por: MerLiNz en 15 de Abril de 2012, 00:42:43
no es porque la logica sea con gotos, es porque una vez se compila el .c el compilador lo pasa a asm todo funciona con gotos a pesar de que "no se vean". Para que me entiendas un if(variable==3) cuando se compila se convierte en:

(codigo de asm)
resta a variable: 3
si el resultado es 0 entonces GOTO a determinado punto del programa (en este caso seria lo que estuviese entre los { }) en caso contrario el programa sigue su curso.

El tema esta en que existe un numero determinado de instrucciones, con esas instrucciones se debe hacer todo, aunque tu pongas cosas raras en C al final todo se convierte en un codigo asm sencillo, aunque tu uses funciones, for, while, do, .... todas estas funcionan con goto.

Como ya he dicho, no hay ninguna repercusion utilizar el goto, pero esta mal visto porque no es la forma de usar el C, es decir, estas usando el C como si fuese ASM.
Título: Re: GOTO en C
Publicado por: Picuino en 15 de Abril de 2012, 05:08:25
Los lenguajes estructurados como el c utilizan el goto "acotado" o como yo decía antes "embotellado".

Los if son un goto condicional hasta el siguiente else
Los break y continue son gotos hasta el final y el comienzo de un bucle
los switch son gotos condicionales hasta los case
los while son gotos hasta el anterior do { o hasta el final del bucle

Y así podríamos seguir con todas las instrucciones. El goto es imprescindible, pero hay formas en las que se puede utilizar de manera segura y formas "inseguras".

La publicación de Knuth (http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf) es un documento de uno de los padres de la programación que alimenta el debate sobre el goto defendiendo su utilización.
En el momento en que acotas el goto con las instrucciones anteriores, le estás limitando y aparece el debate de si sería posible limitar menos el goto y utilizarle en más ocasiones o si todavía sería necesario acotarle más.

Hay quien está en contra de las instrucciones break y continue por ser demasiado peligrosas, ya que son gotos poco disfrazados (poco "embotellados").

Saludos.
Título: Re: GOTO en C
Publicado por: PalitroqueZ en 15 de Abril de 2012, 09:33:10
hay una cosa que no entiendo,

¿la pregunta inicial tiene que ver con C orientado a los microcontroladores?

porque si es así, es totalmente justificable utilizar el goto dependiendo de ciertas condiciones del código, y no solo hablo por el goto, sino por cualquier instrucción assembler embebida en C.


A veces es preferible sacrificar un poco la legibilidad y estructura de un código a cambio de velocidad e interpretación del compilador usado


Título: Re: GOTO en C
Publicado por: Nocturno en 16 de Abril de 2012, 01:49:52
El uso de GOTO en C es igual de poco recomendado que en otros lenguajes no estructurados, pero la única repercusión que tiene es que puede convertir el código en más difícil de entender.
Sin embargo, hay situaciones en las que un GOTO bien puesto se entiende perfectamente; a veces incluso mejor que la conversión del código a estructuras.
No afecta al rendimiento y no genera código más pesado; insisto, es únicamente una recomendación para que el código se entienda mejor.

Yo personalmente no lo uso nunca, y huyo de utilizarlo desde que abandoné el Basic, pero viendo la función final_ciclos() que pegó Diego, diría que no hay ningún problema en poner algún GOTO cuando sea apropiado.
Título: Re: GOTO en C
Publicado por: dogflu66 en 16 de Abril de 2012, 14:15:54
Pues hace 30 años que aprendí a programar con Basic y ya por entonces los buenos manuales de programación en Basic no aconsejaban utilizar el goto, de echo las buenas costumbres de programación son en general las mismas para la programación sobre lenguajes de alto nivel. Y en C no utilizo el goto, no porque quede feo sino porque genera un código muy poco legible y después de un tiempo cuesta mucho trabajo volver a seguirlo para su posterior mantenimiento. Pero coincido que el goto tuvo su utilidad y bajo ciertas circunstancias puede llegar a estar justificado por su simplicidad, aunque yo no lo uso. De todas formas si algo soluciona o simplifica un problema, está claro que yo lo utilizare aun que les moleste a los puristas en programación.
Título: Re: GOTO en C
Publicado por: CompSystems en 26 de Noviembre de 2013, 13:58:28
Un complemento

http://www.todopic.com.ar/foros/index.php?topic=41771.0