簡體   English   中英

c++ 遞增的二維數組

[英]Bidimensional array incrementing in c++

我有一個應該模擬 FIFO 處理器調度的程序,但代碼的問題是,當它執行 cicles 來模擬進程滴答時,它會更改表的值,從而導致無限循環。 代碼如下:

#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]);
    }
}

被弄亂的值是 tabla[temp][2] 中的第 2 列。它從一個數字開始,然后遞增直到達到 1633771873。

該代碼是西班牙語的,因此如果需要,我很樂意提供進一步的聲明。

這個程序有很多錯誤,很難知道從哪里開始

  • 可變長度 arrays 非標准 c++,使用 std::vector
  • 不要將 c 樣式 iO(scanf..)與 c++ io(cin...)混合使用
  • 測試 scanf 之類的返回值

但最大的問題是

for (int i = 1; i <= num; i++) {

C 和 C++ 索引從 0 到大小 -1,而不是從 1 到大小

所以下面這行會導致未定義的行為

  scanf(" %c", &nom[i]); //ingresar nombre a la variable

當我 == 數字

你到處都有那個錯誤。 解決這個問題。 如果你使用了 std::vector 你幾乎肯定會被告知你超出了界限

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM