Autor Tema: Comienzo en C  (Leído 17351 veces)

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

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #30 en: 08 de Junio de 2012, 11:09:57 »
Respondimos los dos juntos. Tené presente que en C para algunos el uso de goto es mala palabra. Y que debés evitarlo.
mirá este hilo http://www.todopic.com.ar/foros/index.php?topic=38049

"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #31 en: 08 de Junio de 2012, 13:16:21 »
Bueno no al "goto", soy muy asembleroso todavía!, cuando tenga una función que requiera "volver a" te pregunto asi me ayudas a resolverlo.
Saludos

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #32 en: 08 de Junio de 2012, 15:47:21 »
Macedo: El tema del goto es filosófico!. Esta contemplado en el lenguaje c. Y se puede usar.
Es una herramienta más. Y por algo está. Y cada uno hace uso como mas le guste. Y podríamos escribir muuuchas horas al respecto. Están los pro y los contra en el hilo que te cité.
Para "volver a.. "  
Pensalo como que una función cuando termina vuelve a donde se la llamó. Y dentro de los bucles te van a ser de ayuda los break y continue. Igualmente debes tener presente que un label debe estar dentro de la función en donde se va a usar. Es decir no podes hacer un label en main y hacer un goto a ella desde fuera de main.
Saludos
       Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #33 en: 09 de Junio de 2012, 10:27:49 »
Hola jukinch, leí el post y es como dos bandos divididos por el uso o no del mismo, voy a tratar de no usarlo y es buena la aclaración de que solo en la función se podría llamar al "goto" y no desde otra.
Gracias

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #34 en: 09 de Junio de 2012, 10:44:11 »
Macedo:
        para que quede claro el hilo subo un ejemplo.
             Saludos.
                 Jukinch

Código: C
  1. /* Cuando se puede usar y cuando no se puede usar el goto.
  2. Un label debe estar dentro de la función en donde se va a usar el goto.
  3. */
  4.  
  5. void testgoto(void)
  6. {
  7.   label1:
  8.   goto label1; // permitido está dentro de la función
  9. }
  10.  
  11. void testgoto2(void)
  12. {
  13.   //goto labelEnMain; // error no se puede llamar a un label fuera de esta función
  14. }
  15.  
  16.  
  17. void main (void)
  18. {
  19.   labelEnMain:
  20.                    testgoto();
  21.   goto labelEnMain; // permitido está dentro de la función
  22. }
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #35 en: 09 de Junio de 2012, 11:11:22 »
Hola me quedo claro, solo dentro de la misma funcion.
Te pregunto sobre esta funcion:
Código: C
  1. if (joystick_up() && joystick_left()&& joystick_select())
  2.      { return KEY_UP; }


Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #36 en: 09 de Junio de 2012, 11:21:54 »
Sobre esto tenés que ver evaluaciones de expresiones, precedencia de operadores, y relaciones de expresiones en cortocircuito.

citando a CONCLASE.NET http://c.conclase.net/curso/?cap=004c

"Existe una regla que en muchas ocasiones nos puede resultar útil, ya que nos puede ahorrar tiempo y comprobaciones adicionales.

Esta regla se conoce como "cortocircuito" o "shortcut", y se aplica de forma diferente a expresiones AND y OR.

En el caso de operaciones AND, consiste en que si la primera expresión evaluada es false, la segunda ni siquiera se evalúa, ya que el resultado será siempre false independientemente del valor del segundo operando.

En el caso de operaciones OR, si la primera expresión sea true, la segunda no se evalúa, ya que el resultado será siempre true, independientemente del valor de la segunda expresión."


     if (joystick_up() && joystick_left()&& joystick_select()) { return KEY_UP; }
        ________________________________________
                                |
                                |
         si todo lo que está aqui dentro es verdadero    se devuelve KEY_UP y como KEY_UP está declarado como un 1 con un define en el archivo user.h del proyecto PIC-LCD3310_TEST_DEMO, el compilador en realidad cambia el texto KEY_UP por un 1 por lo que ese trozo de código queda como return 1;
         Es decir que si el resultado del if es verdadero se devuelve un 1.


Código: C
  1. //joystick definition
  2. #define KEY_NONE    0
  3. #define KEY_UP      1
  4. #define KEY_DOWN    2
  5. #define KEY_LEFT    3
  6. #define KEY_RIGHT   4
  7. #define KEY_CENTER  5

Definición de macros y expansión

Hay dos tipos de macros: las que son como objetos y las que son como funciones. Las que se asemejan a funciones toman parámetros mientras que las que se asemejan a objetos no. La forma de definir un identificador como una macro de cada tipo es, respectivamente:

#define <identificador> <lista de tokens a reemplazar>
#define <identificador>(<lista de parámetros>) <lista de tokens a reemplazar>

Hay que tener en cuenta que no hay ningún espacio entre el identificador de la macro y el paréntesis izquierdo.

Cada vez que el identificador aparezca en el código fuente será reemplazado por la lista de tokens. Incluso si está vacía. Los identificadores declarados como funciones solo se reemplazan cuando se invoca con los parámetros con los que se definió la macro.

Las macros tipo objetos se usan normalmente como parte de prácticas de buena programación para crear nombres simbólicos para constantes. Por ejemplo:

#define PI 3.14159

en vez de utilizar el número tal cual en el código.

Un ejemplo de macro actuando como función es:

#define RADAGRA(x) ((x) * 57.29578)

Esta macro define la forma de convertir radianes a grados. Después podemos escribir RADAGRA(34). El preprocesador sustituirá la llamada a la macro por la multiplicación definida antes. Las macros aquí mostradas están escritas en mayúsculas. Esto permite distinguir fácilmente entre macros y funciones compiladas en el código fuente.

fuente: http://es.wikipedia.org/wiki/Preprocesador_de_C
« Última modificación: 09 de Junio de 2012, 11:41:57 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #37 en: 09 de Junio de 2012, 11:42:22 »
Gracias por responder, pero lo que te iba a preguntar, se me  reseteo la pc cuando estaba escribiendo,  como hace la evaluación la estructura if, primero confirma joystick_up()=1 luego de tener este valor verdadero sigue confirmando los otros dos o con este le vasta y si no si uno de los demás valores son falso todo se cansela?, ahí es donde me trabe ya que es una función solo para el switch UP y no los demás, lo de las definiciones lo entendi pero gracias por tomarte el tiempo de explicarlo nuevamente.
Saludos

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #38 en: 09 de Junio de 2012, 11:45:31 »
Macedo:
          modifiqué el post anterior mientras estabas escribiendo. Agregué el tema de relaciones de expresiones en cortocircuito con lo que se debe aclarar tu duda. Como son AND deben ser todas verdaderas. Pero con una que sea false el resultado del if será falso. Y no se siguen consultando los demás.
           Jukinch
           
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #39 en: 09 de Junio de 2012, 12:50:29 »
Hola eso es lo que no entendía, no se por que esta así si son tres switch diferentes que se accionan individualmente, para mi la función seria:
Código: C
  1. if (joystick_up() ==1)
  2.       { return KEY_UP; }
Si no tendría que accionar los tres a la vez para que me dijese que esta accionado el UP.
Saludos

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Comienzo en C
« Respuesta #40 en: 09 de Junio de 2012, 18:14:17 »
Lo que hace el   if (joystick_up() && joystick_left()&& joystick_select())
        { return KEY_UP; }es eso. Si se pulsaron los tres contactos del joystick retorna 1. Ese caso se da cuando movés el joystick al corner superior izquierdo pulsando también select, todo eso a la vez.
           
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #41 en: 10 de Junio de 2012, 13:55:00 »
Hola, gracias me confunde algunas veces estos cod. nuevos voy a estudiarlos mas!
Saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #42 en: 11 de Junio de 2012, 14:26:33 »
una pregunta, estoy leyendo unos ejemplos del tutorial de suky y me tope con esta instruccion que quiero saber como funciona, es de la pag. 30, cod 2.13.3:
Código: C
  1. }else if (PORTAbits.RA0==0){
  2.     ++i;
  3.       if (i==10){i=0;}
  4.       LATB=Display7seg[i];
  5.       Delay10KTCYx(30);
  6. }

Se lo que quiere explicar, con un pulsador aumento i y esta es la variable para que display7seg muestre su valor, pero he visto la estructura "if else" no al reves, como funciona?.
El "else" tiene que estar en la misma linea de la llave que cierre la estructura anterior?
Primero se verifica si (PORTAbits.RA0==0) si es verdadero aumenta "i" y continua con "if" o si no salta directo al "if" y continua?
Saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comienzo en C
« Respuesta #43 en: 11 de Junio de 2012, 15:04:45 »
Si(x==0){

}sino si(y==0){

}

Entonces, x!=0 pero y==0.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comienzo en C
« Respuesta #44 en: 11 de Junio de 2012, 15:09:57 »
Hola ve verificando una por una hasta que encuentra una que sea verdadera la ejecuta y regresa el control a la función?


 

anything