Autor Tema: Sobre instruccion GOTO en C  (Leído 11309 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Arimai

  • PIC10
  • *
  • Mensajes: 6
Sobre instruccion GOTO en C
« en: 25 de Octubre de 2006, 12:27:24 »
Hola,
estoy realizando una aplicacion para el PIC16f877A en C, para ciertas partes del codigo estoy utilizando bastante la instruccion GOTO ya que veo que uno de sus ventajas es que ahorra ROM. Ademas no se me ocurre otras formas de optimizar el codigo en ROM.
He estado leyendo por el foro que utilizar esta instruccion no es recomendable, pero no sé el porqué.
Me gustaría saber ¿por qué no se aconseja el uso de GOTO?. Y si no es aconsejable, ¿cuál sería la instrucción/es recomendable/s?

Gracias

Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Sobre instruccion GOTO en C
« Respuesta #1 en: 25 de Octubre de 2006, 12:56:47 »
Soy un novato en C, pero en los programas que he hecho no he tenido la necesidad de utilizar la instrucción goto.

Por qué no pones el código para mirar en que te podemos colaborar?

Con el goto tengo la misma la duda, siempre he escuchado que no es recomendable usarlo y que un programa bien elaborado en C no debería tener niguna instrucción goto, pero tampoco se la razón.

saludos.
Pereira - Colombia

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Sobre instruccion GOTO en C
« Respuesta #2 en: 25 de Octubre de 2006, 14:44:39 »
Hola,
estoy realizando una aplicacion para el PIC16f877A en C, para ciertas partes del codigo estoy utilizando bastante la instruccion GOTO ya que veo que uno de sus ventajas es que ahorra ROM. Ademas no se me ocurre otras formas de optimizar el codigo en ROM.
He estado leyendo por el foro que utilizar esta instruccion no es recomendable, pero no sé el porqué.
Me gustaría saber ¿por qué no se aconseja el uso de GOTO?. Y si no es aconsejable, ¿cuál sería la instrucción/es recomendable/s?

Gracias

La erradicación del uso del goto es que en los lenguajes estructurados como Pascal o C, es porque si programas estructuradamente realmente no necesitas un goto.  El uso de un goto en un programa en un lenguaje estructurado demuestra que "algo" de la lógica no está bien pensado.

Según recuerdo, la historia venía porque cuando salió el Pascal y el C, dijeron que no eran lenguajes "serios" si no disponían el goto.  Y por eso su existencia pero realmente no se debiera usar.  Tu programa debiera seguir un curso normal , sea cual fuere, por comprobación del estado de variables, resultado de funciones, etc.

Lo recomendable es que llames a una función, no que le hagas un goto a la misma.

Si expones un caso práctico donde hayas usado un goto en un programa en C, te podría sugerir algo más concreto.

Para optimizar código en ROM, no hay una única ley que te pueda solucionar eso.  Depurar el código es el primer paso, tratar de resolver las cosas con subrutinas, que se llamen varias veces.  Ver de eliminar código superfluo, simplificar la lógica en lo más posible.  Por último, si puedes definir en qué banco de memoria estarán las variables, si agrupas variables que usas juntas en bloques comunes del programa, podrás eliminar código si las ubicas en el mismo banco de memoria, ya que se evita el "bank switching" para acceder a una u otra variable. 

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Zaphyrus

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 323
    • Mi blog: Es cuestión de actitud
Re: Sobre instruccion GOTO en C
« Respuesta #3 en: 27 de Octubre de 2006, 16:53:28 »
Comparto la opinión de Maunix. El GOTO se utiliza en general para salir de una estructura cuando se genera un error crítico. Digamos que estas dentro de una estructura de for y while anidados y en el nivel más profundo ocurre un error crítico, en esta situación se sale de la estructura anidada de golpe a una zona donde se trata este error sin utilizar las sentencias break correspondientes para salir de un nivel a la vez.
Como es sabido que ante un error crítico muy pocas veces hay recuperación esta es la forma más rápida de procesar el error.

Saludos.

Martín
"¿Lo quiere rápido, barato, o bien hecho? Puede elegir dos de las tres cosas." Arthur C. Clarke.
Mi Proyecto Final de Carrera-Microprocesador RISC de 16 bits en HDL: http://martin.calveira.googlepages.com/home
Mi página web o blog: http://es-cuestion-de-actitud.blogspot.com/
Martín Calveira - Zárate - Argentina

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Sobre instruccion GOTO en C
« Respuesta #4 en: 28 de Octubre de 2006, 06:12:46 »
Si se caracteriza el C como un lenguaje estructurado es por la razón de programar sin saltos de código, se dice que un buen programador de C es aquel que hace un programa legible para otros programadores, y eso lleva a no usar instrucciones goto.

PD: Aunque si no hay otra manera, pues a utilizarla que para eso está.


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Sobre instruccion GOTO en C
« Respuesta #5 en: 28 de Octubre de 2006, 09:21:34 »
Érase una vez, hace muuucho, muuuucho tiempo, en que todo o casi todo era GOTO.  :D :D :D

Buscando, buscando por el baúl de los recuerdos ... ¿Reconocéis los respectivos idiomas?  :mrgreen:
(solución al final)

1.-

Código: DOS
  1. PAGE    ,132
  2. ;****************************************************************
  3. ;*   Parameters passed :                                *
  4. ;*                Register BX points to  an argument list       *
  5. ;*                that has the following structure:             *
  6. ;*                ES:[BX] -> DW Count of arguments              *
  7. ;*                           DD Linear address of STRING-VALUE  *
  8. ;*                           DD Length of STRING-VALUE          *
  9. ;*                           DB Data type of STRING-VALUE       *
  10. ;*                           DB Reserved                        *
  11. ;*                           DB Digit count of STRING-VALUE     *
  12. ;*                           DB Scale of STRING-VALUE           *
  13. ;*                           DD Picture address of STRING-VALUE *
  14. ;*                           DD Linear address of STRING-LENGTH *
  15. ;*                           DD Length of STRING-LENGTH         *
  16. ;*                           DB Data type of STRING-LENGTH      *
  17. ;*                           DB Reserved                        *
  18. ;*                           DB Digit count of STRING-LENGTH    *
  19. ;*                           DB Scale of STRING-LENGTH          *
  20. ;*                           DD Picture address of STRING-LENGTH*
  21. ;*                must be converted to segment:offset form.     *
  22. ;*                                                              *
  23. ;****************************************************************
  24. ;
  25. CALLING_PARAMETERS     STRUC
  26. PARAMETER_COUNT        DW     1 DUP (?)
  27. STRING_VALUE_ADDRESS   DD     1 DUP (?)
  28. STRING_VALUE_SIZE      DW     2 DUP (?)
  29. STRING_VALUE_RESERVE   DB     8 DUP (?)  ; Type, digit count, scale
  30. ;                                        ;  and picture address are
  31. ;                                        ;  unused in this subprogram
  32. STRING_LENGTH_ADDRESS  DD     1 DUP (?)
  33. STRING_LENGTH_SIZE     DW     2 DUP (?)
  34. STRING_LENGTH_RESERVE  DB     8 DUP (?)  ; Type, digit count, scale
  35. ;                                        ;  and picture address are
  36. ;                                        ;  unused in this subprogram
  37. CALLING_PARAMETERS     ENDS
  38. ;
  39. CGROUP GROUP CODE
  40. CODE SEGMENT BYTE PUBLIC 'CODE'          ; This program has only one segment.
  41.       ASSUME CS:CGROUP
  42. ;
  43. ;      Local data area
  44. ;
  45. STRING     DB  'This is the string'
  46. LNGTH      EQU $ - STRING
  47. ;
  48. ;
  49. ;      Code segment
  50. ;
  51. ASMTEST    PROC    FAR     ; Allows for far return
  52. ;                          ; Registers ES:BX point to the argument count
  53.        NOP                 ; Allow room for debug INT 3
  54.        CMP     CX, 2
  55.        JNE     FAILURE     ; If argument count is not 2
  56.        CMP     ES:[BX].STRING_VALUE_SIZE + 2, 0
  57.        JNE     FAILURE     ; If string-value too long for asmtst
  58.        CMP     ES:[BX].STRING_VALUE_SIZE, 65280
  59.        JA      FAILURE     ; If string-value too long for asmtst
  60.        CMP     ES:[BX].STRING_VALUE_SIZE, LNGTH
  61.        JB      FAILURE     ; If string-value too short for string
  62.        CMP     ES:[BX].STRING_LENGTH_SIZE + 2, 0
  63.        JNE     FAILURE     ; If not 2-byte BINARY
  64.        CMP     ES:[BX].STRING_LENGTH_SIZE, 2
  65.        JNE     FAILURE     ; If not 2-byte BINARY
  66.        LEA     DI, [BX].STRING_VALUE_ADDRESS
  67.        CALL    CONVERT_ARGUMENT_ADDRESS
  68.        LEA     DI, [BX].STRING_LENGTH_ADDRESS
  69.        CALL    CONVERT_ARGUMENT_ADDRESS
  70. ;
  71.        LDS     SI, ES:[BX].STRING_LENGTH_ADDRESS
  72.        MOV     CX, LNGTH
  73.        MOV     [SI], CH    ; BINARY values are stored high-order byte
  74.        MOV     [SI+1], CL  ; in the lower (lowest) addresses position
  75. ;
  76.        PUSH    CS
  77.        POP     DS
  78.        MOV     SI, offset STRING
  79.        MOV     DX, ES:[BX].STRING_VALUE_SIZE
  80.        SUB     DX, CX      ; DX contains the count of spaces to fill
  81.        LES     DI, ES:[BX].STRING_VALUE_ADDRESS
  82.        REP     MOVSB
  83.        MOV     CX, DX
  84.        MOV     AL, ' '
  85.        REP     STOSB
  86. ;
  87.        XOR     AX,AX       ; Clear AX for return code
  88.        RET
  89. ;
  90. FAILURE:
  91.        MOV     AX, 2       ; Return non-zero error code
  92.        RET
  93. ;
  94. ;
  95. CONVERT_ARGUMENT_ADDRESS               PROC near
  96.        MOV     DX, ES:[DI + 2]
  97.        MOV     AX, ES:[DI]
  98.        MOV     DH, DL
  99.        MOV     DL, AH
  100.        SUB     AH, AH
  101.        SHL     DX, 1
  102.        SHL     DX, 1
  103.        SHL     DX, 1
  104.        SHL     DX, 1
  105.        STOSW
  106.        XCHG    AX, DX
  107.        STOSW
  108.        RET
  109. CONVERT_ARGUMENT_ADDRESS               ENDP
  110. ;
  111. ASMTEST  ENDP
  112. ;
  113. CODE   ENDS
  114.        END     ASMTEST


2.-

Código: DOS
  1. 10 REM  RECV5 SPACE PARITY, CLEARS SCREEN
  2.  
  3. 13 REM  ADDED CODE IN ERROR HANDLER SECTION TO LOAD DEFAULT COMM FORMAT
  4. 14 REM  IF ERROR 68 OCCURED. UPPED REV TO 2.1
  5. 15 REM  ALSO ADDED CODE TO LOOK FOR LF AND FLAG IF NOT FOUND
  6.  
  7. 20 REM  Program to display information input to com1:
  8.  
  9. 40 CLEAR , , 4096
  10. 50 ON ERROR GOTO ERRORHANDLER
  11. 60 DIM A(1 TO 250) AS STRING
  12. 70 ROW = 5: COL = 25
  13. 80 OPEN "RECV5.DAT" FOR RANDOM AS #2 LEN = 30
  14. 90 FIELD #2, 30 AS LASTSETTING$
  15.  
  16. 100 IF LOF(2) <> 0 THEN GOTO 160
  17. 101 CLS
  18. 102 LOCATE 10, 20: PRINT "WHICH COMM PORT WILL YOU BE USING ?"
  19. 104 COLOR 15, 0: LOCATE 13, 25: PRINT "(1)"
  20. 106 COLOR 7, 0: LOCATE 13, 29: PRINT "COMM1"
  21. 107 COLOR 15, 0: LOCATE 13, 36: PRINT "(2)"
  22. 108 COLOR 7, 0: LOCATE 13, 40: PRINT "COMM2"
  23.  
  24. 109 DO
  25. 110 K$ = INKEY$
  26. 111 LOOP WHILE K$ = ""
  27. 112 IF K$ = "1" THEN
  28. 113 SETCOM$ = "COM1:9600,S,7,1,CS0,DS0,CD0,LF"
  29. 114 ELSEIF K$ = "2" THEN
  30. 115 SETCOM$ = "COM2:9600,S,7,1,CS0,DS0,CD0,LF"
  31. 116 ELSE GOTO 109
  32.  
  33. 117 END IF
  34.  
  35. 120 REM SETCOM$ = "COM1:9600,S,7,1,CS0,DS0,CD0,LF"
  36. 130 REM RTS ENABLED, NO CTS,DTR, OR CD REQUIRED
  37. 140 LSET LASTSETTING$ = SETCOM$
  38. 150 PUT #2, 1: GOTO 27000: REM GOTO SET VARIABLES SECTION
  39.  
  40. 160 GET #2, 1
  41. 170 SETCOM$ = LASTSETTING$
  42.  
  43. 180 GOTO 27000: REM GOTO SET VARIABLES SECTION


3.-

Código: DOS
  1. IDENTIFICATION DIVISION.
  2.        PROGRAM-ID. XMENU.
  3.        ENVIRONMENT DIVISION.
  4.        CONFIGURATION SECTION.
  5.        SOURCE-COMPUTER. IBM-AS400.
  6.        OBJECT-COMPUTER. IBM-AS400.
  7.        DATA DIVISION.
  8.        WORKING-STORAGE SECTION.
  9.        77 OPCION     PIC 9(2).
  10.        77 USR        PIC X(10) VALUE ALL ".".
  11.       *-- CONTROL DE FECHAS -----------------------------------------
  12.        01 FECHA      PIC X(6).
  13.        01 FECHA-A.
  14.           03 DIA-A   PIC X(2).
  15.           03 MES-A   PIC X(2).
  16.           03 ANO-A   PIC X(2).
  17.        01 FECHA-B.
  18.           03 ANO-B   PIC X(2).
  19.           03 MES-B   PIC X(2).
  20.           03 DIA-B   PIC X(2).
  21.        01 RELOJ.
  22.           03 HORA    PIC 9(2).
  23.           03 MINUTO  PIC 9(2).
  24.           03 SEGUNDO PIC 9(2).
  25.           03 FILLER  PIC 9(2).
  26.       *-- IND DE PANTALLA ---------------------------------------------
  27.        01  TECLA                        PIC 99999   COMP-1.
  28.       *   Escape
  29.                   88  SALIDA            VALUE 27.
  30.       *   Cursores
  31.                   88  ANTERIOR          VALUE 65.
  32.                   88  POSTERIOR         VALUE 66.
  33.                   88  ARRIBA            VALUE 52.
  34.                   88  ABAJO             VALUE 53.
  35.                   88  ARRIBA-PG         VALUE 67.
  36.                   88  ABAJO-PG          VALUE 68.
  37.                   88  ARRIBA-TODO       VALUE 54.
  38.                   88  ABAJO-TODO        VALUE 82.
  39.       *   Funciones
  40.                   88  F1                VALUE 01.
  41.                   88  F2                VALUE 02.
  42.                   88  F3                VALUE 03.
  43.                   88  F4                VALUE 04.
  44.                   88  F5                VALUE 05.
  45.                   88  F6                VALUE 06.
  46.                   88  F7                VALUE 07.
  47.                   88  F8                VALUE 08.
  48.                   88  F9                VALUE 09.
  49.                   88  F10               VALUE 10.
  50.  
  51.       *----------------------------------------------------------------
  52.        77 PROC                          PIC X(3) VALUE "***".
  53.       *----------------------------------------------------------------
  54.        PROCEDURE DIVISION.
  55.       *----------------------------------------------------------------
  56.        MAIN SECTION.
  57.        INICIO.
  58.            DISPLAY " " ERASE.
  59.        PRESENTA.
  60.            DISPLAY "Usuario:"               LINE 1 POSITION 4  LOW.
  61.            DISPLAY  USR                     LINE 1 POSITION 13 LOW.
  62.            DISPLAY "Menu   :"               LINE 2 POSITION 4  LOW.
  63.            DISPLAY "... Gestion Bibliografica ...."
  64.                                             LINE 1 POSITION 26.
  65.            ACCEPT FECHA  FROM DATE. MOVE FECHA TO FECHA-B.
  66.            DISPLAY DIA-B LINE 1 POSITION 71 "/" LOW
  67.                                      MES-B "/" LOW ANO-B.
  68.            ACCEPT  RELOJ FROM TIME.
  69.            DISPLAY HORA  LINE 2 POSITION 71 ":" LOW
  70.                                      MINUTO ":" LOW SEGUNDO.
  71.       *-----------------------------------------------------------------*
  72.       *    MENU GENERAL DE LA APLICACION                                *
  73.       *-----------------------------------------------------------------*
  74.        GENERAL.
  75.            MOVE "***" TO PROC.
  76.            PERFORM PRESENTA.
  77.            DISPLAY "GENERAL..."
  78.                                 LINE 2 POSITION 13 LOW.
  79.            DISPLAY " Diego Marquez. "
  80.                                 LINE 2 POSITION 26 REVERSE.
  81.       *-----------------------------------------------------------------
  82.            DISPLAY " 1. Gestion de Libros.             "
  83.                                 LINE  4 POSITION 4 LOW "|" LOW.
  84.            DISPLAY " 2. Gestion de Materias.           "
  85.                                 LINE  5 POSITION 4 LOW "|" LOW.
  86.            DISPLAY " 3.                                "
  87.                                 LINE  6 POSITION 4 LOW "|" LOW.
  88.            DISPLAY " 4.                                "
  89.                                 LINE  7 POSITION 4 LOW "|" LOW.
  90.            DISPLAY " 5.                                "
  91.                                 LINE  8 POSITION 4 LOW "|" LOW.
  92.            DISPLAY "11. Listados de Libros y Volumenes "
  93.                                 LINE 14 POSITION 4 LOW "|" LOW.
  94.            DISPLAY "12. Listado de Materias.           "
  95.                                 LINE 15 POSITION 4 LOW "|" LOW.
  96.            DISPLAY "13. Calculadora                    "
  97.                                 LINE  4 POSITION 44 LOW.
  98.            DISPLAY "14. Editor de Textos.              "
  99.                                 LINE  5 POSITION 44 LOW.
  100.            DISPLAY "15.                                "
  101.                                 LINE  6 POSITION 44 LOW.
  102.            DISPLAY "16.                                "
  103.                                 LINE  7 POSITION 44 LOW.
  104.            DISPLAY "17.                                "
  105.                                 LINE  8 POSITION 44 LOW.
  106.            DISPLAY "24. FIN DE SESION                  "
  107.                                 LINE 15 POSITION 44 LOW.
  108.       *-----------------------------------------------------------------
  109.        GENERAL-ACP.
  110.            DISPLAY "TECLEE SU OPCION: __ (Y SU MENSAJE) : "
  111.                                 LINE 20 POSITION  2 LOW
  112.                 ALL "_" SIZE 41 LINE 20 POSITION 40 LOW
  113.                 ALL "_" SIZE 79 LINE 21 POSITION  1 LOW.
  114.        GENERAL-OP.
  115.            ACCEPT OPCION NO BEEP CONVERT PROMPT LINE 20 POSITION 20
  116.            TAB    ON EXCEPTION TECLA GO GENERAL-CONTROL.
  117.        GENERAL-CONTROL.
  118.            IF SALIDA OR OPCION EQUAL 24 OR F3    GO OP-SALIDA.
  119.            IF OPCION EQUAL  1 CALL "XGLIB.COB"
  120.                             CANCEL "XGLIB.COB"   GO GENERAL.
  121.            IF OPCION EQUAL  2 CALL "XGMAT.COB"
  122.                             CANCEL "XGMAT.COB"   GO GENERAL.
  123.            IF OPCION EQUAL 11 CALL "XLLIB01.COB"
  124.                             CANCEL "XLLIB01.COB" GO GENERAL.
  125.            IF OPCION EQUAL 12 CALL "XLMAT01.COB"
  126.                             CANCEL "XLMAT01.COB" GO GENERAL.
  127.            IF OPCION EQUAL 13 CALL "DMCALC.COB"
  128.                             CANCEL "DMCALC.COB"  GO GENERAL.
  129.            IF OPCION EQUAL 14 CALL "DMEDIT.COB"
  130.                             CANCEL "DMEDIT.COB"  GO GENERAL.
  131.            GO GENERAL-OP.
  132.       *----------------------------------------------------------------
  133.        OP-SALIDA. DISPLAY " " ERASE.
  134.        OP-EXIT. EXIT PROGRAM.
  135.        OP-STOP. STOP RUN.
  136.       *----------------------------------------------------------------
  137.        GIRA-FECHA SECTION.
  138.        GF.
  139.            MOVE FECHA TO FECHA-A.
  140.            MOVE DIA-A TO DIA-B.
  141.            MOVE MES-A TO MES-B.
  142.            MOVE ANO-A TO ANO-B.
  143.            MOVE FECHA-B TO FECHA.
  144.        GF-EXIT. EXIT.
  145.       *----------------------------------------------------------------


4.-

Código: DOS
  1. set status off
  2. set console on
  3. set talk off
  4. store .t. to bucle
  5. store 40  to cx
  6. store 10  to cy
  7. store "O" to caracter
  8. @ cy,cx say caracter
  9. do while bucle
  10.         pepe=inkey()
  11.         if pepe =  5
  12.           @ cy,cx say " "
  13.           store cy - 1 to cy
  14.           @ cy,cx say caracter
  15.         endif
  16.         if pepe =  24
  17.           @ cy,cx say " "
  18.           store cy + 1 to cy
  19.           @ cy,cx say caracter
  20.         endif
  21.         if pepe =  19
  22.           @ cy,cx say " "
  23.           store cx - 1 to cx
  24.           @ cy,cx say caracter
  25.         endif
  26.         if pepe =  4
  27.           @ cy,cx say " "
  28.           store cx + 1 to cx
  29.           @ cy,cx say caracter
  30.         endif
  31.         if pepe = 27 .or. pepe = 83 .or. pepe = 115
  32.           store .F. to bucle
  33.         endif
  34.         if pepe = 13 .and. caracter = "O"
  35.           store "X" to caracter
  36.           @ cy,cx say caracter
  37.           loop
  38.         endif
  39.         if pepe = 13 .and. caracter = "X"
  40.           store "O" to caracter
  41.           @ cy,cx say caracter
  42.           loop
  43.         endif
  44.         if pepe <> 0
  45.            @ 1,1 say pepe picture "999"+caracter
  46.         endif
  47. enddo

1.- Ensamblador x86 para DOS
2.- GWBasic para DOS
3.- Ryan McFarland Cobol para DOS
4.- Ashton Tate DBASE II para DOS

Directamente desde el fondo de los tiempos para el Foro TODOPIC.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Sobre instruccion GOTO en C
« Respuesta #6 en: 28 de Octubre de 2006, 13:36:10 »
Joe, querido Diego, sólo te ha faltado salpimentarlo con un poco de Fortran y una mijita de logo y te habría quedado un peazo de gazpacho antiguo, antiguo...  :P

Con respecto al GOTO, creo recordar que alguien fue capaz de demostrar matemáticamente que con programación estructurada no hacían falta GOTOs. Lo que pasa es que no soy capaz de encontrar documentación al respecto.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Sobre instruccion GOTO en C
« Respuesta #7 en: 28 de Octubre de 2006, 16:02:42 »
Ja, ja, ja  :D :D :D

Manolo: No hace falta dar muchas vueltas. En los ejemplos que he puesto, con el último idioma, el DBASE II de Ashton Tate (antes de ser comprado por Borland) hice comercialmente en 1985 toda una Contabilidad General completa sin utilizar un solo GOTO: simplemente no existía en este idioma. No habían implementado ningún tipo de salto incondicional, todo era un inmenso bucle dentro de otro. Las únicas structuras de control de flujo eran las If, While, y case.  :mrgreen:

De este primigenio idioma surgieron después los compiladores de FoxBase, Clipper ... y mas tarde los Visual FoxBase ...  :P

P.D: De Fortran tengo por algun lado los programas que hice cuando estudiaba ... No te lo vas a creer pero en la Escuela Superior de Ingenieros Técnicos Industriales de Sevilla en 1978 se escribían (y escribí) programas en idioma FORTRAN y se les introducía a la Julia ¡¡¡ en tarjetas perforadas !!!


« Última modificación: 28 de Octubre de 2006, 16:20:28 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Zaphyrus

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 323
    • Mi blog: Es cuestión de actitud
Re: Sobre instruccion GOTO en C
« Respuesta #8 en: 29 de Octubre de 2006, 01:00:36 »
 :shock: RedPic se ve que en tus venas corren torrentes de bits!!!!

Saludos y gracias por la clase de antropología ¿o será más bien programología?
"¿Lo quiere rápido, barato, o bien hecho? Puede elegir dos de las tres cosas." Arthur C. Clarke.
Mi Proyecto Final de Carrera-Microprocesador RISC de 16 bits en HDL: http://martin.calveira.googlepages.com/home
Mi página web o blog: http://es-cuestion-de-actitud.blogspot.com/
Martín Calveira - Zárate - Argentina

Desconectado Darukur

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 464
    • Informacion, recursos y ejemplos para desarrollos con microcontroladores
Re: Sobre instruccion GOTO en C
« Respuesta #9 en: 31 de Octubre de 2006, 14:52:00 »
Los saltos computados "goto" realmente no se deberian usar, ya que no respetan el curso normal de la estructura de código.
Pero si esta y es legitimo su uso, no veo el problema de usarlo.
En realidad hay casos en donde el "goto" se hace útil. En el sistema operativo SALVO, que es del tipo cooperativo, no se puede realizar el "context switch" en otro lugar que no sea "root" de la tarea.
Con esto queda completamente fuera de uso las optimizaciones con llamadas a funciones o procedimientos si es que deben tener internamente un context switch.
Por ende, todo lo que se pueda optimizar en el entorno de la tarea, (y por lo menos para mi ;)) esta permitido.
Eso si, es verdad que se hace mas dificil la compresion, pero todo es un equilibrio de beneficios vs desventajas.

Saludos!

PD: Con respecto a código "dificil de leer" o "código ofuscado" Zaphyrus puede contar... Vio algun código mio.... ;)
« Última modificación: 31 de Octubre de 2006, 14:55:14 por Darukur »
El que no sabe lo que busca no entiende lo que encuentra.
Mi Pagina Web:  http://www.sistemasembebidos.com.ar
Mi foro:             http://www.sistemasembebidos.com.ar/foro/

Desconectado Zaphyrus

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 323
    • Mi blog: Es cuestión de actitud
Re: Sobre instruccion GOTO en C
« Respuesta #10 en: 31 de Octubre de 2006, 15:04:17 »
Darukur, es verdad!!! Algunos dicen que es la forma de manter el trabajo pero yo diría que es para reventar neuronas. También depende de la forma de escribir código de cada uno, la indexación y la forma de ponerle nombres a las variables.
El uso del GOTO hay veces que reduce la cantidad de instrucciones en C para un rutina pero el problema es para quien lo debe leer después. En mi caso escribir GOTO es mala palabra y para mí no existe en el lenguaje C.

Salutes.

Martín
"¿Lo quiere rápido, barato, o bien hecho? Puede elegir dos de las tres cosas." Arthur C. Clarke.
Mi Proyecto Final de Carrera-Microprocesador RISC de 16 bits en HDL: http://martin.calveira.googlepages.com/home
Mi página web o blog: http://es-cuestion-de-actitud.blogspot.com/
Martín Calveira - Zárate - Argentina

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Sobre instruccion GOTO en C
« Respuesta #11 en: 31 de Octubre de 2006, 16:02:58 »
Vaya clase que le dieron al pobre Arimai !! :D :D
Falto decirle que si usa el GOTO en C lo vamos a fusilar !!! :lol: :lol:

Yo quiero decirle a Arimai que seguramente si pones el codigo que estas haciendo aqui, todos te ayudaremos a entender como se puede hacer lo mismo en forma logica, optimizada y muy mantenible a futuro...

Ahhh!!!... y bienvenido al foro !!! :-/ :-/ :-/
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Sobre instruccion GOTO en C
« Respuesta #12 en: 31 de Octubre de 2006, 16:08:25 »
Solo quiero comentar algo sobre mi expereincia en el tema.

Comencé programando en pascal allá por el año 1990, 1991 ya ni recuerdo.

Luego hice cosas en C y luego ya me moví a Delphi.

Jamás tuve que usar un goto y no porque los programas no fueran complejos, sencillamente no lo he necesitado. 

No se me ocurre un ejemplo donde con un goto se resuelva algo que no se resuelva de otra forma y con un nivel de complejidad similar.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado 5GTT

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 915
Re: Sobre instruccion GOTO en C
« Respuesta #13 en: 01 de Noviembre de 2006, 22:58:01 »

P.D: De Fortran tengo por algun lado los programas que hice cuando estudiaba ... No te lo vas a creer pero en la Escuela Superior de Ingenieros Técnicos Industriales de Sevilla en 1978 se escribían (y escribí) programas en idioma FORTRAN y se les introducía a la Julia ¡¡¡ en tarjetas perforadas !!!


Y en la Carlos III de Industriales Madrid en el 2001 e imagino que aun seguiran usandolo, asi que te creo jajajaja. La verdad que con ese lenguaje aprendes a hacer pseudocodigos y comprender un poco la estructura de un programa. Aunque hubiera preferido directamente C.

Saludos.

Tutoriales y proyectos de electrónica

Desconectado Arimai

  • PIC10
  • *
  • Mensajes: 6
Re: Sobre instruccion GOTO en C
« Respuesta #14 en: 06 de Noviembre de 2006, 09:42:52 »
Hola a todo el mundo, he estado fuera y no he podido ponerles un ejemplo respecto al goto en C.
El caso es que el uso de GOTO lo hago por aprovechar al maximo la memoria ROM, como creo que ya dije. El goto, me ahorra memoria ROM del PIC frente al switch. Os adjunto el uso que hago del goto frente al switch.

Ejemplo switch:
Código: [Seleccionar]
switch(b)
{
   case 1:  //instruccion
   break;
   case 2:  //instruccion
   break;
   case 3:  //instruccion
   break;
   case 4:  //instruccion
   break;
   default:  //instruccion
   break;
}


Ejemplo goto:
Código: [Seleccionar]
goto_address(etiqueta_bs+b);
etiqueta_bs:
goto b_1;
goto b_2;
goto b_3;

Este tipo de bloque lo utilizo a lo largo de mi programa muchas veces por lo que me ocupa bastante espacio, y no es posible introducir estos bloques como funcion como habreis pensado algunos, ya que cada vez la instruccion a ejecutar es diferente.
EN resumen, el switch ocupa mas memoria que el goto, supongo que es porque es mas parecido al lenguaje ensamblador.
¿Que opinais respecto a su uso ahora?¿Habria otra opcion mas optimizada que la del goto?

Un saludo y muchas gracias por vuestras respuestas.