Autor Tema: GOTO en C  (Leído 7105 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: GOTO en C
« Respuesta #15 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);
   }
}
« Última modificación: 14 de Abril de 2012, 19:33:03 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: GOTO en C
« Respuesta #16 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: GOTO en C
« Respuesta #17 en: 14 de Abril de 2012, 19:17:20 »
« Última modificación: 14 de Abril de 2012, 19:32:26 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: GOTO en C
« Respuesta #18 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
« Última modificación: 14 de Abril de 2012, 19:29:04 por Picuino »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: GOTO en C
« Respuesta #19 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

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: GOTO en C
« Respuesta #20 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.
« Última modificación: 14 de Abril de 2012, 19:34:22 por Picuino »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: GOTO en C
« Respuesta #21 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
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: GOTO en C
« Respuesta #22 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.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: GOTO en C
« Respuesta #23 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: GOTO en C
« Respuesta #24 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 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.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: GOTO en C
« Respuesta #25 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


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: GOTO en C
« Respuesta #26 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.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: GOTO en C
« Respuesta #27 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.
Saludos desde Granada, España.

Desconectado CompSystems

  • PIC18
  • ****
  • Mensajes: 488
    • Home Page
Re: GOTO en C
« Respuesta #28 en: 26 de Noviembre de 2013, 13:58:28 »
Desde Colombia


 

anything