I have a program that should simulate the FIFO processor scheduling but the issue with the code is that when it is doing the cicles to simulate process ticks, it changes the value of the table causing an infinite loop. The code is the following:
#include <iostream>
#include <stdio.h>
#include <ctype.h>
#include <iomanip>
#include <conio.h>
using namespace std;
/* 1- Entrada
2- Servicio
3- Inicio
4- Fin
5- Retorno
6- Espera
7- Retorno normal */
int main() {
//Declarar variables
int num;
printf("Indique el numero de programas que va a evaluar.\n");
cin>>num; //Ingresar base
while (cin.fail()){
cin.clear();
cin.ignore();
printf("El valor ingresado no es un numero entero. Intente nuevamente.\n");
cin>>num;
}
char linea[num];
int tabla[num][6]; //Arreglo bidimensional para tabla de datos
char nom[num];
float normal[num]; //Declarar columna de retornos normalizados
char lespera[num];
bool flag = true;
//Ingreso de datos base
for(int i=1; i<=num; i ){
nombre: //bandera inicializar nombre
printf("Ingrese un caracter para reconocer el proceso %d.\n", i);
scanf(" %c", &nom[i]); //ingresar nombre a la variable
if(isalpha(nom[i])){ //verificar que el nombre sea un caracter valido
}
else{
printf("Nombre invalido, solo un caracter alfabetico es permitido. Intente nuevamente\n");
goto nombre; //Ir a bandera linea 13
}
printf("Ingrese tiempo de entrada para el proceso %c\n", nom[i]);
cin>>tabla[i][1];
while (cin.fail()){
cin.clear();
cin.ignore();
printf("El valor ingresado no es un numero entero. Intente nuevamente.\n");
cin>>tabla[i][1];
}
printf("Ingrese tiempo de servicio para el proceso %c\n", nom[i]);
cin>>tabla[i][2];
while (cin.fail()){
cin.clear();
cin.ignore();
printf("El valor ingresado no es un numero entero. Intente nuevamente.\n");
cin>>tabla[i][2];
}
}
int temp = 1;
int tick = 0;
int lista[num];
int turn = 1;
int marcador = 1;
int proc = 0;
int tareas = 0;
int paso, cuenta =0;
while(tareas < num){
printf("Tick %d\n", tick);
for(int i=1; i<=num; i ){ //Ciclo evaluador de columna
if(tabla[i][1] == tick){ //Verifica si un proceso entra en el tick actual
printf("Proceso \"%c\" enviado a la lista de espera\n", nom[i]);
lista[turn] = i; //Mete el numero de fila a la lista de espera
printf("%d\n", lista[turn]);
turn ;
}
}
if(flag == false && proc < tabla[temp][2]){ //Se ejecuta si el numero de servicio es mayor al numero de iteraciones actual
printf("Proceso \"%c\" avanza un tick\n", nom[temp]);
proc ;
printf("\"%c\" lleva %d pasos de %d\n", nom[temp], proc, tabla[temp][2]);
printf("temp vale %d\n", temp);
printf("Tiempo de proceso es igual a %d\n", tabla[temp][2]);
linea[cuenta] = nom[temp]; //Carga la cadena de caracteres final
cuenta ;
}
if(proc == tabla[temp][2]){ //Revisa si han pasado los ticks necesarios para completar el tiempo de proceso
printf("Proceso \"%c\" termina su proceso\n", nom[temp]);
tareas ;
proc = 0;
flag = true; //Marca que el procesador esta libre
marcador ;
tabla[temp][4] = tick; //Establece el tick del fin del proceso;
printf("El proceso termino en %d\n", tabla[temp][4]);
}
if(flag == true && lista[marcador] != NULL){ //Compara si hay procesos en espera y si el procesador esta libre
temp = lista[marcador];
printf("temp ahora es %d\n", temp);
flag = false; //Indica que hay un proceso realizandose
printf("Proceso \"%c\" ha empezado a ejecutarse\n", nom[temp]);
tabla[temp][3] = tick; //Se establece el valor de inicio
printf("Inicio de proceso en %d\n", tabla[temp][3]);
}
tick ;
getch();
}
printf("%d\n", cuenta);
for(int i=0; i<cuenta; i ){
printf("%c", linea[i]);
}
printf("\n");
//Algoritmo calculador del resto de datos de la tabla
for(int i=0; i<num; i ){
int res;
float resu;
res = (tabla[i][4] 1) - tabla[i][3]; //(Fin 1) - llegada para sacar retorno
tabla[i][5] = res;
res = tabla[i][5] - tabla[i][2]; //retorno - servicio para sacar espera
tabla[i][6] = res;
resu = (float)tabla[i][5]/(float)tabla[i][2]; //Divide retorno entre servicio para sacar retorno normalizado
normal[i] = resu;
}
for(int i = 0; i<num; i ){
printf("%c %d %d %d %d %d %d %4.2f\n", nom[i], tabla[i][1], tabla[i][2], tabla[i][3], tabla[i][4], tabla[i][5], tabla[i][6], normal[i]);
}
}
The value getting messed up is the one in tabla[temp][2] which is the column 2. It starts at a number and then increments until it reaches 1633771873.
The code is in spanish so I will be glad to give further aclarations if needed.
CodePudding user response:
There is so much wrong with this program its hard to know where to start
- Variable length arrays a non standard c , use std::vector
- dont mix c style iO (scanf..) with c io (cin...)
- test the return values from things like scanf
But the big issue is this
for (int i = 1; i <= num; i ) {
C and C indexes run from 0 to size -1, not from 1 to size
so this following line results in undefined behaviour
scanf(" %c", &nom[i]); //ingresar nombre a la variable
when i == num
You have that error all over the place. Fix that. If you had use std::vector you would have almost certainly been told you were out of bounds