Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problemas con la recursividad

Estas en el tema de Problemas con la recursividad en el foro de C/C++ en Foros del Web. Hola, tengo un problema y escribo para buscar ayuda. En mi programa principal se llama a una función. Ejecuta muestra . Dentro de la función ...
  #1 (permalink)  
Antiguo 10/01/2011, 04:07
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 13 años, 8 meses
Puntos: 0
Problemas con la recursividad

Hola, tengo un problema y escribo para buscar ayuda.

En mi programa principal se llama a una función. Ejecuta muestra.
Dentro de la función exisste un for en el que se hacen llamadas recursivas a ejecuta_muestra.

Mi programa va ejecutando hilos hasta una cierta condición de parada. Se van haciendo FOR y se van llamando a más hilos.

El problema es que llegado un momento e incluso habiendo pasado por el FOR, para de ejecutar hilos y termina.

El código es muy largo asique intento poner lo necesario.
Un saludo fuerte.


int ejecuta_muestra(float* peiodo_MTBF, FILE *fichero, float* MTBF, int* contadorfallosMTBF, int* primerMTBF, int primer_fallo, float* sumacuadradoMTTT, float* sumaMTTT, int transicion_pasada, float tiempos_en_umbral[num_umbrales], float hilos_indisponibilidad[1], int ultimo_hilo, int primera_ejecucion, int intentos_umbrales[num_umbrales], int primer_hilo, float reloj, int umbral_muestra, int* funcionamiento_sistema, float acontecimientos[num_acontecimientos], int sistema_reparacion[tamanio_sistema_reparacion],
int sistema[num_elementos], float tasas_de_fallos[num_elementos], float landas[fallos_grupo], int umbrales[num_umbrales], int reintentos_umbrales[num_umbrales], int funcionamiento_sistema_[num_umbrales],
float reloj_[num_umbrales], float estado_float[num_umbrales][tamanio_estado_float], int estado_int[num_umbrales][tamanio_estado_int]);


main () /* PROGRAMA PRINCIPAL */
{
....
....
....
fallos_muestra = ejecuta_muestra(&periodo_MTBF, fichero, &MTBF, &contadorfallosMTBF, &primerMTBF, primer_fallo, &sumacuadradoMTTT, &sumaMTTT, transicion_pasada, tiempos_en_umbral, hilos_indisponibilidad, ultimo_hilo, primera_ejecucion, intentos_restantes, primer_hilo, 0, 0, &funcionamiento_sistema, acontecimientos, sistema_reparacion, sistema, tasas_de_fallos, landas, umbrales, reintentos_umbrales, funcionamiento_sistema_, reloj_, estado_float, estado_int);

....
....
}


int ejecuta_muestra(float* periodo_MTBF, FILE *fichero, float* MTBF, int* contadorfallosMTBF, int* primerMTBF, int primer_fallo, float* sumacuadradoMTTT, float* sumaMTTT, int transicion_pasada, float tiempos_en_umbral[num_umbrales], float hilos_indisponibilidad[1], int ultimo_hilo, int primera_ejecucion, int intentos_restantes[num_umbrales], int primer_hilo, float reloj, int umbral_hilo, int* funcionamiento_sistema, float acontecimientos[num_acontecimientos], int sistema_reparacion[tamanio_sistema_reparacion],
int sistema[num_elementos], float tasas_de_fallos[num_elementos], float landas[fallos_grupo], int umbrales[num_umbrales], int reintentos_umbrales[num_umbrales], int funcionamiento_sistema_[num_umbrales],
float reloj_[num_umbrales], float estado_float[num_umbrales][tamanio_estado_float], int estado_int[num_umbrales][tamanio_estado_int])
{
int siguiente_acontecimiento, que_elemento, posicion,i, posicion_umbral, fallos;
float cantidad_a_reducir;
int copia_sistema_reparacion[tamanio_sistema_reparacion]; int ultimo_ha_descendido = 0;
int num_fallos = 0; int hilo_fallo = 0; int descenso_umbral = 0; int total_fallos = 0; int vuelta_hilo;
int fallos_antes = 0;int hasta_que_pos_umbral; float relojMTTT = 0;


int pintar, l;

vuelta_hilo = 0;
if (primera_ejecucion == 0)
/* siempre que este subprograma se ejecuta es por nuevo hilo, y hay que volcar el estado,
pero no si es la llamada inicial y es el hilo que viene de 0, ya viene inicializado desde fuera */
{
vuelca_estado(umbral_hilo, estado_int, estado_float, acontecimientos, sistema_reparacion, sistema, tasas_de_fallos);
intentos_restantes[umbral_hilo-1] = intentos_restantes[umbral_hilo -1]-1; /* saber cuantos faltan para cortar ultimo al ir descendiendo */
*funcionamiento_sistema = funcionamiento_sistema_[umbral_hilo -1]; reloj = reloj_[umbral_hilo -1];
if (primer_hilo == 0) {/* cambiar acontecimientos para que no se repita */
fprintf(fichero,"cambiando los acontecimientos\n");
cambia_acontecimientos(acontecimientos, tasas_de_fallos);
}
}

primera_ejecucion = 0; /* no ha volcado, ya siempre puede volcar el estado */
fprintf(fichero,"---------------------------------\n");
fprintf(fichero,"Va hilo del umbral %d\n", umbral_hilo);

while ((vuelta_hilo == 0) && (reloj<duracion_muestra) && (descenso_umbral == 0))/* Condicion de parada de cada muestra */
{
,"Alcanza Umbral intermedio\n");
ultimo_ha_descendido = 0;
umbral_hilo++;
intentos_restantes[umbral_hilo-1] = reintentos_umbrales[umbral_hilo -1]; /* se reponen */
captura_estado(umbral_hilo, estado_int, estado_float, acontecimientos, sistema_reparacion, sistema, tasas_de_fallos,
*funcionamiento_sistema, reloj, funcionamiento_sistema_, reloj_);

fprintf(fichero, "el for se lanza con %d\n", reintentos_umbrales[umbral_hilo-1]);
for (i=1;i<= reintentos_umbrales[umbral_hilo-1];i++)
{/* el umbral 1, esta en la pos 0, etc */
if (!(i == reintentos_umbrales[umbral_hilo-1])) {ultimo_hilo = 0;}
else {ultimo_hilo = 1; ultimo_ha_descendido = 0;}
fprintf(fichero,"-va el hilo %d\n", i);
if (i==1) {primer_hilo = 1;}
else {primer_hilo = 0;}
num_fallos = num_fallos + ejecuta_muestra(periodo_MTBF, fichero, MTBF, contadorfallosMTBF, primerMTBF, primer_fallo, sumacuadradoMTTT, sumaMTTT, transicion_pasada, tiempos_en_umbral, hilos_indisponibilidad, ultimo_hilo, primera_ejecucion, intentos_restantes, primer_hilo, reloj,
umbral_hilo, funcionamiento_sistema, acontecimientos, sistema_reparacion, sistema,
tasas_de_fallos, landas, umbrales, reintentos_umbrales, funcionamiento_sistema_, reloj_, estado_float, estado_int);
vuelta_hilo = 1;

if ((intentos_restantes[0] == 0) && (intentos_restantes[1] == 0)) {return(num_fallos);}
}
}
}
} /* fin restart */
}
else {/* para que salga porque ese acontecimiento ya se pasaba */
if (*funcionamiento_sistema == 0) {hilos_indisponibilidad[0] = hilos_indisponibilidad[0]+1;}
}
} /* fin de la muestra */

return(num_fallos);
}




Creo que el código es lo de menos pues funciona bien por los resultados obtenidos, el problema está en que por ejemplo si se hace un for de 3 llamadas, al acbo del tiempo se corta y deja 2 hilos sin ejeecutar, y yo quiero que si ha hecho el for ejecute todos.

Hago printf cada evz que pasa por el for y para saber cuantos hilos lanza, y puede observarse que aunque haga un for de 3 iteraciones, se corta en el hilo 1.

Etiquetas: recursividad
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:37.