elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Orden de ejecucuion de sentencias
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Orden de ejecucuion de sentencias  (Leído 2,020 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Orden de ejecucuion de sentencias
« en: 18 Enero 2019, 12:48 pm »

Buenas

Cuando estamos dentro de una funcion y llamamos a otra  que pasa en la ejecucion?

Ejemplo:

Código
  1. Void sumar(){
  2.     // hace una cosa 1
  3.     // hace otra.cosa mas 2
  4.     MostrarMenuPrincipal();
  5.     // hace otra.cosa 3
  6.     // hace 4
  7.  
  8.     Int valor;
  9.     std::cout << "ingrese valor: ";
  10.     Std::cin >> valor;
  11.  
  12.     Switch (valor){
  13.         case 1:
  14.               Cout << "es uno ";
  15.               Break;
  16.      }
  17. }
  18.  
  19. Void MostrarMenuPrincipal(){
  20.       // hace otras cosas 5
  21. }
  22.  

Que sucede?
1. Cuando se ejecuta la funcion sumar() va a llegar hasta la llamada a la funcion MostrarMenuPrincipal() y esperara a que esa funcion devuelva un valor o termine, por lo que la linea «hacer otra.cosa 3» no sera ejecutada al intante...

2. Cuando se ejecuta la funcion sumar() va a llegar hasta la llamada a la funcion MostrarMenuPrincipal() y al instante continuara paralelamente ejecutando ambas funciones....

Les pregunto esto ya que en un programa de practica que realice ayer me paso algo extraño, cuando la funcion que llamaba dentro de otra tenia un menu y una interaccion con el usuario mediante cin, la ejecucion de la funcion anterior (en este caso.sumar() ) no se ejecutaba mas quedaba bloqueada por la llamada a la nueva funcion, sin embargo, si esta nueva funcion no.tenia cin, la ejecutaba y luego volvia a la funcion anterior..



En línea

Dungeons & dragons;
dragons.Attack();
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Orden de ejecucuion de sentencias
« Respuesta #1 en: 18 Enero 2019, 13:28 pm »

Ocurre 1.
Sobre tu explicación no la entendí bien, reorganiza el texto.
Pero supongo que te encontraste con el problema del vaciado de buffer stdout.


En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Orden de ejecucuion de sentencias
« Respuesta #2 en: 18 Enero 2019, 14:27 pm »

Creo que tienes razon, hay algo en eso del buffer stdout....

Concretamente en el programa que estaba haciendo, hay algo asi:

Código
  1.  
  2. void ingresarNota(){
  3.  
  4.     unsigned int opcion = 9;    
  5.     char * asignatura = new char[16];
  6.  
  7.     cout << "Menu: " << endl;
  8.     cout << "1- Matematicas " << endl;
  9.     cout << "2- Historia " << endl;
  10.     cout << "3- Ingles " << endl;
  11.  
  12.     cout << "Opcion (0 = Regresa al menu principal) : ";
  13.     cin >> opcion;
  14.  
  15.  
  16.     switch (opcion){
  17.  
  18.          case 0:
  19.              cout << string(100, '\n');     //limpiar pantalla
  20.              mostrarMenuPrincipal();
  21.              break;
  22.  
  23.          case 1:
  24.               strcpy (asignatura, "Matematicas");
  25.               break;
  26.  
  27.          case 2:
  28.               strcpy (asignatura, "Historia");
  29.               break;
  30.  
  31.          case 3:
  32.               strcpy (asignatura, "Ingles");
  33.               break;
  34.  
  35.  
  36.     }
  37.  
  38.     cout << endl << "Asignatura seleccionada : " << asignatura << endl;
  39.  
  40.     //otra instruccion 1
  41.     //otra instruccion 2
  42.     //ciclo for 3
  43.     //ciclo for 4
  44. }
  45.  
  46. void mostrarMenuPrincipal(){
  47.  
  48.     unsigned int opcion = 9;
  49.  
  50.     cout << "Menu Principal: " << endl;
  51.     cout << "-----------------------" << endl;
  52.     cout << "1- Ingrese Alumno nuevo " << endl;
  53.     cout << "2- Seleccionar alumno " << endl;
  54.     cout << "3- Ingrese nota" << endl;
  55.     cout << "4- Salir" << endl;
  56.  
  57.     cout << "Opcion: ";
  58.     cin >> opcion;
  59.  
  60.     switch (opcion){
  61.  
  62.          case 1:
  63.               nuevoAlumno();
  64.               break;
  65.  
  66.          case 2:
  67.               seleccionaAlumno();
  68.               break;
  69.  
  70.          case 3:
  71.               ingresarNota();
  72.               break;
  73.  
  74.          case 4:
  75.               exit(0);
  76.  
  77.     }
  78.  
  79. }
  80.  
  81.  


En el codigo, cuando el programa pasa por ingresarNota() y si yo selecciono 0, lo que hace es entrar a mostrarMenuPrincipal() pero alcanza a salir de switch-case y alcanza a ejecutar la linea "cout << endl << "Asignatura seleccionada : " << asignatura << endl"  luego de eso ya no sigue ejecutando nada, es decir, la instruccion "//otra instruccion 1" ya no es ejecutada..
En línea

Dungeons & dragons;
dragons.Attack();
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Orden de ejecucuion de sentencias
« Respuesta #3 en: 18 Enero 2019, 18:03 pm »

Hay funciones que se ejecutan al ser llamadas de forma asíncrona y otras que detienen la ejecución y no se ejecuta la siguiente instrucción hasta regresas de la llamada, esto es son síncronas.

- En general todas las llamadas internas son síncronas, ya que lo que ha de pasar después a menudo depende de lo que pase antes y necesita los valores de regreso (si hubiere alguno)... Uno luego decide si algo debe ser asíncrono, básicamente  guarda datos y pone en marcha un temporizador, que cuando salte tomará dichos datos y los procese, la ejecución previa, en cambio sigue su curso...

- Y en general llamadas externas pueden ser asíncronas. No cuando estas llamadas sean para ejecutar funcionalidad especifica, si en cambio cuando es para por ejemplo ejecutar un programa, o cuestiones de hardware (el harware admite 'esperas', pero no le gustan las 'esperas indefinidas', razón por la que 'prefiere asíncrono y admita interrupciones). Luego es uno quien si lo precisa puede hacer que una llamada  asíncrona se comporte como si fuera síncrona (esto es, forzar una espera hasta que aquella termine).

Lo que tiene que quedarte claro es cuando es razonable que una llamada (por lógica sea o deba ser síncrona y cuando asíncrona).
Por ejemplo: Si pides entrada de datos del usuario es razonable que sea síncrono, porque si no estás obligando a que el usuario tenga que responder en un tiempo finito y muy breve... en general mientras el usuario no pulse la tecla 'enter', no se da por finalizada la entrada de datos. Puede optarse por funciones que leen carácter a carácter... pero vamos si se espera una introducción de más de un carácter, en general la técnica de devolución pasa por pulsar la tecla intro, a modo de indicador de finalización de la entrada del usuario.

Algo a tener en cuenta es la multitarea, que en realidad simula procesos asíncronos a cambio de conmutar entre tareas cada cierto intervalo de tiempo.

Es algo que con el tiempo a medida que avances en la programación, irás teniendo mucho más claro, de momento si estás empezando, básicamente considera que tu código se ejecuta de modo secuencial... y con el tiempo irás conociendo en detalle las excepciones y los motivos para ello.
« Última modificación: 18 Enero 2019, 18:07 pm por NEBIRE » En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Orden de ejecucuion de sentencias
« Respuesta #4 en: 18 Enero 2019, 19:13 pm »

Excelente amigos, gracias por la explicación...

Me ha quedado claro.
En línea

Dungeons & dragons;
dragons.Attack();
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problemilla con vb y las sentencias...
Programación Visual Basic
Hans el Topo 3 2,507 Último mensaje 22 Junio 2006, 17:06 pm
por Hans el Topo
¿Donde van las sentencias imports ?
.NET (C#, VB.NET, ASP)
AlbertoBSD 1 1,978 Último mensaje 17 Junio 2016, 18:12 pm
por DiegoAZL
Orden de las imágenes al imprimir no sigue orden carpeta
Windows
Esgrimidor 8 5,987 Último mensaje 3 Julio 2017, 13:48 pm
por Randomize
Sentencias SQL
Bases de Datos
alvaro1975 1 1,970 Último mensaje 14 Diciembre 2018, 17:10 pm
por Carloswaldo
Problema de ejecucuion con teclado musical y gstreamer y c++
Programación C/C++
mtoledo 6 3,199 Último mensaje 22 Noviembre 2019, 19:17 pm
por kub0x
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines