Home > Software design >  Bidimensional array incrementing in c
Bidimensional array incrementing in c

Time:03-07

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

  • Related