Autor Tema: Una pregunta sobre C  (Leído 2155 veces)

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

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Una pregunta sobre C
« en: 24 de Agosto de 2009, 11:39:28 »
Hola.
Estoy aprendiendo C para los Freescale, ya he hecho algunas cosas, pero ahora me ha surgido una duda, pongamos este ejemplo, para no llenar tanto texto pongo entre /* lo que hace la rutina, variables y resultados en esa rutina:

Código: C
  1. void Main (void){
  2. for(;; ){
  3.  
  4. // ***************  Proceso 1 *******************
  5.  
  6.  
  7. void Proceso1(void) {
  8.  
  9. // variables    //En este proceso tecleo un valor y al darle # guardo ese valor
  10. // para procesarlo en la función principal
  11. // con * doy escape, volver a introducir el valor solo en este proceso1
  12.  
  13. Rutina_leer_Teclado();
  14.  
  15. ValorProceso=ValorTeclado;
  16.  
  17. if (ValorTeclado='#'){
  18.  
  19. GrabarValorProceso1();
  20.  
  21. break;                                      // interrumpo y paso al Proceso siguiente
  22. }
  23.  
  24.  
  25. if (ValorTeclado='*'){
  26.  
  27. //******** Pregunta que hago: Como hago para volver a iniciar este proceso1?
  28.  
  29. }
  30.  
  31. //***Proceso 2****
  32.  
  33. void Proceso2(void) {
  34.  
  35. // variables    //En este proceso tecleo un valor y al darle # guardo ese valor
  36. // para procesarlo en la función principal
  37. // con * doy escape, vuelvo al  proceso1
  38.  
  39. Rutina_leer_Teclado();
  40.  
  41. ValorProceso2=ValorTeclado;
  42.  
  43. if (ValorTeclado='#'){
  44.  
  45. GrabarValorProceso2();
  46.  
  47. break; // interrumpo y paso al Proceso siguiente
  48. }
  49.  
  50. if (ValorTeclado='*'){
  51.  
  52. //* Pregunta que hago: Como hago para volver al proceso1?
  53.  
  54. }
  55.  
  56. // y así con más procesos, del proceso 3 poder volver al 2, o del proceso 4 al 3 y así
  57.  
  58. }
  59. }

Dentro del código están las preguntas en rojo.

Se que existe la sentencia <switch - case>, pero al tratar de hacerlo por esos medios me resulta un código demasiado grande y al ver que en ASM, solo es hacer la pregunta y escribir un <goto Proceso1 >, entonces por eso hago la pregunta:como ir a una rutina estando dentro de otra, sin que vuelva a la rutina de donde se hizo el llamado? si no que siga con lo que sigue a la rutina llamada,,algo asi:

rutina 2....
....
....
Rutina 3..
..
Preguntar, si respuesta es verdadera : goto Rutina 2


Ojala me haga entender bien.

Saludos y gracias por la ayuda.
« Última modificación: 24 de Agosto de 2009, 12:15:24 por marvicdigital »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Una pregunta sobre C
« Respuesta #1 en: 24 de Agosto de 2009, 11:53:01 »
Hola, no se entiende el código, antes de publicar podes hacer previsualizar que te muestta como va a quedar el post, emprolijalo y vemos...

Saludos !

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Una pregunta sobre C
« Respuesta #2 en: 24 de Agosto de 2009, 13:25:13 »
Hola marcvicdigital,

hay un pequeño lio de concepto al escribir tu código en C. Olvídate de los goto del assembler.

Te comento:
1) Declara los procesos fuera del main, no dentro. Son todas funciones diferentes (main, proceso1 y proceso2).
2) El 'break' solo te corta la ejecucion de un bucle (for, while), pero no corta la ejecucion de una funcion a mitad. Para ello escribe 'return', y con ello saldra de la función en ese punto.

No acabo de entender del todo que hace "Rutina_leer_Teclado()". Lee '#' o '*' y graba no se que valor en el proceso, o lee un número acabado en '#' o '*' y ese es el número que guarda como valor del proceso......

Si aclaras un poquito mejor el tema, te acabamos de dirigir la respuesta.

En regla general seria algo asi:

- Defines una funcion que se llame por ej: Actualizar_proceso() y sera compartida por todos los procesos.

Código: [Seleccionar]
void Actualizar_proceso()
{
  Rutina_leer_Teclado();  // Lees lo que haya que leer...

  if (ValorTeclado='#')
  {
    GrabarValorProcesoX(num_proceso); // Guardas el valor leido
    if(num_proceso < TOTAL_PROCESOS) num_proceso =num_proceso + 1; // pasa al siguiente proceso, excepto si es el ultimo. En ese caso se queda en el último
  }
  else if(ValorTeclado='*')
  {
    if(num_proceso > 1) num_proceso = num_proceso - 1;  // Si es 1, la siguiente vez tambien escribe el valor del proeso 1 (no hay anterior)
  }
}

void Main()
{
  for(;;)
 {
   Actualizar_proceso();
 }
}

Luego la funcion "GrabarValorProcesoX(num_proceso)" graba el valor del proceso en el sitio adecuado. Le pasas como parametro a que proceso se refiere.

Un saludo.
« Última modificación: 24 de Agosto de 2009, 15:03:02 por un Moderador »

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Una pregunta sobre C
« Respuesta #3 en: 25 de Agosto de 2009, 07:55:14 »
Muchas gracias Damago, voy analizar tu ejemplo y lo aplicaré a lo que quiero.
De nuevo mil gracias.

Saludos

Desconectado al303576RELOADED

  • PIC10
  • *
  • Mensajes: 11
Re: Una pregunta sobre C
« Respuesta #4 en: 02 de Octubre de 2009, 16:22:46 »
Es algo arriesgado tu codigo pero si lo quieres es andar saltando de un lugar atro a placer te sugiero que eches un vistaso a los punteros a funciones.


si queires llamarla solo tiens que hacer un cast a a la direccion de esta funcion y listo. pero si en lo posible no uses los goto.

o pudes usar el puntero a esa funcion. (puntero a funcion tambien es conocido como un callback)


 

anything