Autor Tema: La elegancia del "C"  (Leído 3944 veces)

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

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
La elegancia del "C"
« en: 23 de Mayo de 2007, 20:35:56 »
Una característica que tiene el lenguaje "C" es que permite escribir código muy compacto, en una sola línea pòdemos poner un monton de instrucciones quedando el programa con unas pocas líneas y condensado al máximo. Para los puristas del "C" esto es un virtud, para los principiantes es una maldición.

Veamos un ejemplo, y nada mejor para ello que el típico programa de parpadeo de un led a una cadencia de 1 segundo:

1º) programado de forma convencional:

Código: CSS
  1. #include "led.h"
  2.  
  3. void main()
  4. {
  5.  
  6.    setup_adc_ports(NO_ANALOGS);
  7.    setup_adc(ADC_OFF);
  8.    setup_spi(SPI_SS_DISABLED);
  9.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  10.    setup_timer_1(T1_DISABLED);
  11.    setup_timer_2(T2_DISABLED,0,1);
  12.    
  13.    while(true)
  14.       {
  15.       output_bit( PIN_A3, 0);
  16.       delay_ms( 1000 );
  17.       output_bit( PIN_A3, 1);
  18.       delay_ms( 1000 );
  19.       }

Programado de forma compacta:

Código: CSS
  1. #include "led.h"
  2.  
  3.  
  4. void main()
  5. {
  6.  
  7.    setup_adc_ports(NO_ANALOGS);
  8.    setup_adc(ADC_OFF);
  9.    setup_spi(SPI_SS_DISABLED);
  10.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  11.    setup_timer_1(T1_DISABLED);
  12.    setup_timer_2(T2_DISABLED,0,1);
  13.    
  14.    while(true)
  15.       {
  16.       output_bit( PIN_A3, !input_state(pin_A3));
  17.       delay_ms( 1000 );
  18.       }

Podemos observar como hemos reducido de forma drástica el número de líneas de código.

Un saludo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: La elegancia del "C"
« Respuesta #1 en: 23 de Mayo de 2007, 21:34:46 »
En CCS, se tiene tambein otro comando que reduce aun mas tu ejemplo amigo jfh900.


Código: [Seleccionar]
void main()
{
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_spi(SPI_SS_DISABLED);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
 
  while(true)
     {
     output_toggle( PIN_A3);
     delay_ms( 1000 );
     }
}

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: La elegancia del "C"
« Respuesta #2 en: 23 de Mayo de 2007, 22:16:34 »
Tienes toda la razón PICmouse, con esa función podemos simplificar más la expresión. Pero a mí me gusta más hacerlo yo por mi cuenta, ¿como lo hariamos?, pues así:

Código: CSS
  1. #define _output_toggle( Pin ) (output_bit( Pin, !input_state( Pin )))

Y se utiliza como:

Código: CSS
  1. _output_toggle(PIN_A3);

Con lo cual creamos nuestra propia función mediante una macro de precompilación.

El resultado:

Código: CSS
  1. #include "led.h"
  2. #define _output_toggle( Pin ) (output_bit( Pin, !input_state( Pin )))
  3.  
  4. void main()
  5. {    
  6.        setup_adc_ports(NO_ANALOGS);  
  7.        setup_adc(ADC_OFF);  
  8.        setup_spi(SPI_SS_DISABLED);  
  9.        setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);  
  10.        setup_timer_1(T1_DISABLED);  
  11.        setup_timer_2(T2_DISABLED,0,1);      
  12.        while(true)      
  13.            {      
  14.            _output_toggle(PIN_A3);
  15.            delay_ms( 1000 );      
  16.            }
  17. }

Saludos
« Última modificación: 23 de Mayo de 2007, 22:21:31 por jfh900 »
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: La elegancia del "C"
« Respuesta #3 en: 24 de Mayo de 2007, 02:52:07 »
yo trato de apegarme lo más posible a la forma tradicional porque si muchas veces, después de tres meses sin revisar un programa, no entiendo claramente lo que he escrito imaginen si además lo encripto con semejantes construcciones sintácticas.

Amigo PICmouse creo que lo que tienes con la gramática es delirio, ya es suficiente con el castellano, ¿ahora también vienes con la de C?  :D :D :D

Yo prefiero experimentar con las construcciones sintácticas para ver cómo ahorro más memoria de programas, no cuantas líneas de C me ahorro.

Por ejemplo me encanta utilizar el operador ? : pero he comprobado que el compilador de CCS, la mayoría de las veces consume más memoria que con unos if anidados.

De todos modos me gusta este hilo, seguro que aprendo algunos secretitos de la parte críptica del C, así que sigan posteando sus maravillas monolíneas que las voy a seguir con entusiasmo.

Un saludo Reinier
« Última modificación: 24 de Mayo de 2007, 02:54:27 por reiniertl »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: La elegancia del "C"
« Respuesta #4 en: 24 de Mayo de 2007, 08:32:15 »
      output_bit( PIN_A3, !input_state(pin_A3));
      delay_ms( 1000 );
Así, es, sin irme por las ramas quiero decir que si bien C lo permite y en código muy breve, no hay que olvidarse que esto funcionará porque está el delay de un segundo a continuación.  Si fuera un toggle muy veloz sobre un pin, en un pic corriendo a 20Mhz sobre una salida que esté 'cargada' pudiera darse el caso que no funcione como esperamos si es que la instrucción se compila como un bsf o un bcf y un btfss o btfsc.

Dejo este link como ejemplo:
http://www.todopic.com.ar/foros/index.php?topic=17350.0


En C18 se puede hacer lo siguiente por ejemplo que intuyo ha de ser posible con muchos otros compiladores y es.

LATAbits.LATA3 ^= 1;

Lo que hace un XOR del valor con 1, haciendo un 'toggle'.   :) :)
- 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 LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: La elegancia del "C"
« Respuesta #5 en: 24 de Mayo de 2007, 08:37:19 »
Citar
Amigo PICmouse creo que lo que tienes con la gramática es delirio, ya es suficiente con el castellano, ¿ahora también vienes con la de C?

 :D :D Quien me manda a tratar de escribir rápido.  :D :D

Látigo como a todos!!!  :D

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: La elegancia del "C"
« Respuesta #6 en: 24 de Mayo de 2007, 16:24:22 »
bueno el tema, pudiera orientarse a como escribir mejor los programas, y según el título desde el punto de vista del C.

a lo mejor estaré equivocado (y espero despegarme de esta maña), desde que empecé a escribir en c, siempre he tratado de optimizar los programas con la menor cantidad de lineas posibles, no importando cuan y cual irá rápido, todo ello con la intención de que los programas no sean tan largos como los del asm.

pero como ya dije son 2 puntos de vistas que hay y por supuesto en cuanto a micros se refiere la velocidad es un factor a tomar en cuenta.

esto lo escribe uno que todavía no se ha topado con esta limitación.  :5}
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: La elegancia del "C"
« Respuesta #7 en: 24 de Mayo de 2007, 19:31:48 »
a lo mejor estaré equivocado (y espero despegarme de esta maña), desde que empecé a escribir en c, siempre he tratado de optimizar los programas con la menor cantidad de lineas posibles,
Creo que buscar perfeccionarse uno mismo es siempre una buena costumbre.

no importando cuan y cual irá rápido, todo ello con la intención de que los programas no sean tan largos como los del asm.

Y, a veces es importante esto.  Lo intuitivo sería que un código más breve ejecute más rápido pero esto no es así.  Puede que un código más extenso (usando o sin usar punteros por ejemplo) se ejecute más o menos rápido.  Depende de la arquitectura, del tipo de código, etc.

También el uso o no uso de esa maña como le llamas tu, depende de si programas solo o en grupo.  Cuando se programa en grupo se suelen establecer ciertas "pautas" de "cómo" codificar porque sino el código de otro es ilegible o dificil de leer para uno, y viceversa.
- 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 jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: La elegancia del "C"
« Respuesta #8 en: 24 de Mayo de 2007, 20:55:37 »
Otro pequeño ejemplo de como simplificar las instrucciones. Esto está extraido del propio foro:

Código: CSS
  1. printf("%d",Viaje[j]);
  2. j++;

Lo podemos escribir como:

Código: CSS
  1. printf("%d",Viaje[j++]);


Si por el contrario tenemos:

Código: CSS
  1. j++;
  2. printf("%d",Viaje[j]);

Pondríamos:

Código: CSS
  1. printf("%d",Viaje[++j]);

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: La elegancia del "C"
« Respuesta #9 en: 25 de Mayo de 2007, 14:12:57 »
Lo malo de hacer las cosas compactas es a la hora de depurar errores, que es algo más tedioso, el C es una maravilla  :mrgreen:


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

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: La elegancia del "C"
« Respuesta #10 en: 25 de Mayo de 2007, 14:18:44 »
Utilizando el método binario de subdivisión en la depuración, obtendremos rápidamente la línea que contiene el error. Por otra parte (aunque no es el caso en los pic) cuando tenemos un gran número de líneas de código, la compactación facilita el seguimiento del programa, al haber menos líneas.

Un saludo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: La elegancia del "C"
« Respuesta #11 en: 28 de Mayo de 2007, 13:41:21 »
otra de las 'bondades' del c. el uso ordenado de los datos mediante estructuras:

por ejemplo mostrar datos en varios displays 7-seg, con sus unidades, decenas y centenas

se pueden crear (y hay que crearlas) 3 variables llamadas

int unidad;
int decena;
int centena;

una forma elegante (desde el punto de vista de sintáxis) es ordenar esos datos es llamar a una estructura:

struct digitos_separados {         // variables en bcd de unidad,decena,centena
      int  unidad, decena, centena;
   } digito;

a la hora de llamarlo podemos escribir

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


 

anything