TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: 13pic en 14 de Febrero de 2009, 09:43:31

Título: bucle en c
Publicado por: 13pic en 14 de Febrero de 2009, 09:43:31
buenas, soy nuevo en c y quisiera saber cual es la palabra para hacer un bucle, como goto en ensamblador.
muchas gracias :-/
Título: Re: bucle en c
Publicado por: MGLSOFT en 14 de Febrero de 2009, 09:49:36
No te confundas.
GOTO es un salto, no un bucle.

En C puedes hacer bucles condicionales con For-Next, con While y Do-While.
Tambien se puede generar un bucle con If-Then, pero no es la aplicacion ideal.

Bienvenido al foro!!
Título: Re: bucle en c
Publicado por: jfh900 en 14 de Febrero de 2009, 09:50:50
La forma mas común es con:

while(Condición)
  {
  Instrucciones del bucle
  }

En "C" no están permitidos los saltos tipo "goto" aunque algunos compiladores si lo implementan.

Un saludo
Título: Re: bucle en c
Publicado por: RedPic en 14 de Febrero de 2009, 09:51:08
Código: CSS
  1. int8 i;
  2.  
  3. for(i=valor_inicial; i<valor_final;i++){
  4.  
  5.    // Aqui lo que desees iterar
  6.  
  7. }
  8.  
  9. // Por ejemplo
  10. for(i=0; i<5;i++){
  11.  
  12.    // Aqui tendrás sucesivamente 5 iteraciones
  13.    // con la variable i cambiando de 0 .. 1 .. 2 ... 3 ... y 4
  14. }

Un saludo.
Título: Re: bucle en c
Publicado por: gera en 14 de Febrero de 2009, 13:16:34
Ya q sacaron el tema... no se por q existe el for en C. Se puede lograr exactamente el mismo comportamiento con un while. (en otros lenguajes esta justificado porq los for tienen otro comportamiento)
Código: [Seleccionar]
for(i=0;i<x;i++)
{
  //codigo
}
Es lo mismo que
Código: [Seleccionar]
i=0;
while(i<x)
{
  //codigo
  i++
}

Salvo que el for utilice instrucciones especiales de maquina q lo hacen mas eficiente, no veo motivo para q exista. Eso si, es mas comodo q su equivalencia con el while jeje
saludos!
Título: Re: bucle en c
Publicado por: migsantiago en 14 de Febrero de 2009, 13:59:48
Hay veces que se necesita modificar el valor de i dependiendo de los resultados obtenidos en una iteración y hay ocasiones en que i siempre es modificado.

Cuando i siempre es modificado, se usa un for. Cuando i a veces es modificado, se usa un while.
Título: Re: bucle en c
Publicado por: Nocturno en 14 de Febrero de 2009, 14:29:42
No exactamente, migsantiago.

Estoy leyendo la biblia del lenguaje C y viene a decir que el uso del for o del while es cuestión de gustos.

Se puede tener un for en el que la i sea modificada sólo a veces, y un while en el que lo sea siempre.
Título: Re: bucle en c
Publicado por: migsantiago en 14 de Febrero de 2009, 14:38:29
No exactamente, migsantiago.

Estoy leyendo la biblia del lenguaje C y viene a decir que el uso del for o del while es cuestión de gustos.

Se puede tener un for en el que la i sea modificada sólo a veces, y un while en el que lo sea siempre.

¿Y cómo sería ese for?

Talvez así...

Código: [Seleccionar]
for(i=0;i<5;i++)
{
if(estado==0)
   i--;
}

Pero seguramente existen diferencias entre un while y un for al momento de ser compilados, uno debe generar menos código ensamblador que el otro. Me refiero a que un for es más eficiente que un while bajo ciertas condiciones y viceversa.
Título: Re: bucle en c
Publicado por: Cryn en 14 de Febrero de 2009, 14:40:08
en un for también se puede usar

CONTINUE;

BREAK;

para saltar un valor de i, o para terminarlo antes de terminar la cuenta de i, nunca hice la prueba en CCS, pero supongo que si funcionará porque el break si "rompe"
Título: Re: bucle en c
Publicado por: gera en 14 de Febrero de 2009, 17:52:30
Yo creo q es una cuestion de gustos como dice Nocturno. Quizas el for existe para que aquellos q vienen de otros lenguajes no lo extrañen, q se yo.
En la facu nos negamos a usar el for (pese a un bug del compilador borland, le agarramos odio jeje [de todos modos ahora usamos gcc :wink:]), y tambien conozco gente q lo usa de forma extraña. Por ej en lugar de hacer un while(1), ponen for( ; ; ) :shock:. La verdad q me parece muy poco estetico, pero sobre gustos no hay nada escrito.
Título: Re: bucle en c
Publicado por: RedPic en 14 de Febrero de 2009, 18:04:38
Es cuestión de gustos ... y de claridad. La declaración de un for() múltiple con inicialización de media docena de variables, cinco comprobaciones de fin del bucle y una docena de incrementos o decrementos sólo es "visible" a primera vista en un for()

No es raro que yo utilice un código de este tipo:
Código: C#
  1. for(i=0,j=100,K=-1;i<MAXLEN,j>0,K!=0;i++,--j){
  2.     // y tal y tal
  3.   }

Título: Re: bucle en c
Publicado por: gera en 14 de Febrero de 2009, 18:11:00
La verdad que si, queda mucho mas prolijo asi. Por cierto, las condiciones se tienen q dar simultaneamente para q el bucle termine? o con que se de una ya esta? (en otras palabras, las comas hacen de && o de ||?)
Título: Re: bucle en c
Publicado por: RedPic en 14 de Febrero de 2009, 18:13:02
No gera, cualquiera de ellas hace que termine el bucle, es como si estuviesen unidas por ||.
Título: Re: bucle en c
Publicado por: mariano_pic en 14 de Febrero de 2009, 18:19:43
buenas, soy nuevo en c y quisiera saber cual es la palabra para hacer un bucle, como goto en ensamblador.
muchas gracias :-/

     Hola amigo, lo que necesitas es un bucle en c, que se paresca a un goto cerrado en ensamblador

    ejemplo:
    asm:

    Rutina_prinsipal:
    ..
    ..
    ..
    goto    Rutina_prinsipal


   Cuando se hace un programa en asm tenemos que tener este bucle para mantener nuestro codigo actuando constantemente
   en c podemos hacer lo siguiente:


   while(1){
   ...
   ...//comandos c
    }

    Si quieres implementar un contador:

    en asm:


    movlw  .5
    movwf  reg1
 bucle:
    decfsz   reg1,f
    goto      bucle
    ...
    ...

    puedes utilizar un bucle controlado por contador tipo for

    int8 reg1
    for(reg1=0;reg1<5;reg1++){

    }
    
    si quieres pudes usar el while como contador:

   reg1=0;
   while(reg1<5){
     reg1++;
    }

    y bueno espero te sea util.
Título: Re: bucle en c
Publicado por: 13pic en 16 de Febrero de 2009, 18:28:40
muchisimas gracias a todos, y gracias por las explicaciones detalladas :D