[英]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。
該代碼是西班牙語的,因此如果需要,我很樂意提供進一步的聲明。
這個程序有很多錯誤,很難知道從哪里開始
但最大的問題是
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.