Ya pude arreglar el error de la linea 259. Para lograrlo modifique la variable global de la siguiente forma:
Agregue además una variable global de tipo bool: instpast_made = false
Y después de la linea 63 agregue para que quedara así:
Al final el código quedo así:
Solo falta arreglar lo de la funcion void deleteMem() para borrar la memoria alocada.
Código (cpp) [Seleccionar]
string *inst_past = NULL;
Agregue además una variable global de tipo bool: instpast_made = false
Y después de la linea 63 agregue para que quedara así:
Código (cpp) [Seleccionar]
case 1: numb_inst = stoi(linea);
if (!instpast_made){
inst_past = new string[numb_inst];
instpast_made = true;
}
archivoSalidaFetch << "No.de instrucciones: " << numb_inst << endl;
break;
Al final el código quedo así:
Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void generarCicloFetch();
void imprimirMem();
void deleteMem();
void ejecutarMem();
void escribirMem();
string conc(int ac_2, unsigned int numb_digit);
void buscarInstSig();
void buscarInstPast();
void guardarInstPast();
void saltoDireccion();
void cargaAC();
void imprimir_PC_IR_AC();
fstream archivoEntrada;
ofstream archivoSalidaFetch;
ofstream archivoSalidaMem;
ofstream archivoSalidaAC;
string nombre;
string linea;
string stroper;
string strdirdat;
string str_ir, str_ac, str_pc;
const int cols = 2;
int filas;
int countlines = 0, i = 1, j = 0, i2, count_inst = 0, ciclos = 0, numb_inst = 0, numb_dat = 0, dirini_inst = 0, dirini_dat = 0, dir, pc, ac, ir, oper, numb_inst_past=0;
bool inst_captured = false, mem_made = false, instpast_made = false, ejecutarPrograma = true, imprimirCabecera_PC_IR_AC = false;
string **mem = new string*[filas];
string *inst_past = NULL;//string *inst_past = new string[numb_inst];
int main() {
generarCicloFetch();
//cout << "\n\nmemoria\n" << mem[0][0] << " " << mem[0][1] << endl;
//imprimirMem();
//deleteMem();
/*escribirMem();
escribirMem();*/
ejecutarMem();
cout << endl;
system("pause");
return 0;
}
void generarCicloFetch(){
cout << "Escribe el nombre del archivo de texto.\nEscribe tambien la extension (.txt): ";
fflush(stdin);
getline(cin, nombre);
archivoEntrada.open(nombre.c_str(), ios::in);
if (archivoEntrada.is_open()) {
archivoSalidaFetch.open("ciclofetch.txt", ios::out);
archivoSalidaFetch << "Archivo: " << nombre << endl << endl;
while (!archivoEntrada.eof()) {
getline(archivoEntrada, linea);
countlines++;
switch (countlines){
case 1: numb_inst = stoi(linea);
if (!instpast_made){
inst_past = new string[numb_inst];
instpast_made = true;
}
archivoSalidaFetch << "No.de instrucciones: " << numb_inst << endl;
break;
case 2: numb_dat = stoi(linea);
archivoSalidaFetch << "No. de datos: " << numb_dat << endl;
break;
case 3: dirini_inst = stoi(linea);
archivoSalidaFetch << "Dirección inicial de instrucciones: " << dirini_inst << endl;
break;
case 4: dirini_dat = stoi(linea);
archivoSalidaFetch << "Dirección inicial de datos: " << dirini_dat << endl << endl;
break;
}
if (countlines >= 5){
if (!mem_made){
filas = numb_inst + numb_dat;
for (int i = 0; i < filas; i++)
mem[i] = new string[cols];
mem_made = true;
}
if (linea.length() == 4){
if (countlines == 5){
archivoSalidaFetch << "Instrucciones" << endl;
dir = dirini_inst;
}
/*stroper = linea[0];
strdirdat = linea.substr(1, 3);*/
if (i <= numb_inst && !inst_captured){
stroper = linea[0];
strdirdat = linea.substr(1, 3);
archivoSalidaFetch << dir << " Cod: " << stroper << " Dir: " << strdirdat << endl;
mem[i - 1][j] = to_string(dir);
mem[i - 1][j + 1] = linea;
dir++;
i++;
if (i > numb_inst){
inst_captured = true;
i2 = i;
i = 1;
dir = dirini_dat;
archivoSalidaFetch << "\nDatos" << endl;
}
}
else if (inst_captured && i <= numb_dat){
archivoSalidaFetch << dir << " Valor: " << linea << endl;
mem[i2 - 1][j] = to_string(dir);
mem[i2 - 1][j + 1] = linea;
dir++;
i++;
i2++;
}
}
}
}
archivoEntrada.close();
archivoSalidaFetch.close();
cout << "\nArchivo de salida (ciclofetch.txt) creado con exito..." << endl;
}
else cout << "\nArchivo inexistente o faltan permisos para abrirlo" << endl;
}
void imprimirMem(){
cout << "\n\nMemoria" << endl << endl;
for (int i = 0; i < filas; i++){
for (int j = 0; j < cols; j++){
cout << mem[i][j] << " ";
}
cout << endl;
}
}
void deleteMem(){
// Clean Up
/*for (int i = 0; i < filas; i++)
delete [] mem[i];*/
//delete [] mem;
}
void ejecutarMem(){
if (ciclos == 0){
pc = dirini_inst;
buscarInstSig();
}
else if (ciclos > 0){
buscarInstSig();
buscarInstPast();
}
if (ejecutarPrograma){
if (!imprimirCabecera_PC_IR_AC){
cout << "\n\n\tPC\t|\tIR\t|\tAC" << endl;
cout << " -------------------------------------------" << endl;
imprimirCabecera_PC_IR_AC = true;
}
switch (oper)
{
case 0:// salto direccion
imprimir_PC_IR_AC();
guardarInstPast();
ciclos++;
saltoDireccion();
break;
case 1:// carga AC con mem[dir]
cargaAC();
imprimir_PC_IR_AC();
guardarInstPast();
pc++;
ciclos++;
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
default:
break;
}
}
}
string conc(int ac_2, unsigned int numb_digit){
string str;
str = to_string(ac_2);
while (str.length() < numb_digit){
str = "0" + str;
}
return str;
}
void escribirMem(){
archivoSalidaMem.open("memoria.txt", ios::app);
for (int i = 0; i < filas; i++){
for (int j = 0; j < cols; j++){
if (j == 1){
archivoSalidaMem << " ";
}
archivoSalidaMem << mem[i][j];
}
archivoSalidaMem << endl;
}
archivoSalidaMem << endl;
archivoSalidaMem.close();
}
void buscarInstSig(){
bool inst_found;
inst_found = false;
str_pc = to_string(pc);
for (int i = 0; i < numb_inst && !inst_found; i++){
//str_pc = to_string(pc);
if (str_pc == mem[i][0]){
str_ir = mem[i][1];
stroper = str_ir[0];
strdirdat = str_ir.substr(1, 3);
oper = stoi(stroper);
dir = stoi(strdirdat);
inst_found = true;
}
}
}
void buscarInstPast(){
bool instpast_found;
instpast_found = false;
if (numb_inst_past > 0){
for (int i = 0; i < numb_inst_past && !instpast_found; i++){
//buscarInstSig();
if (str_ir == inst_past[i]){
instpast_found = true;
ejecutarPrograma = false;
}
}
}
}
void guardarInstPast(){
if (numb_inst_past == 0){
i = 0;
}
inst_past[i] = str_ir;
//cout << "\ninst_past[i]: " << inst_past[i] << endl;
i++;
numb_inst_past++;
}
void saltoDireccion(){
pc = dir;
}
void imprimir_PC_IR_AC(){
str_ac = conc(ac, 4);
cout << "\t" << pc << "\t|\t" << str_ir << "\t|\t" << str_ac << endl;
}
void cargaAC(){
bool dat_found;
dat_found = false;
/*string str_pc_aux;
str_pc_aux = to_string(dir);*/
for (int i = numb_inst; i < filas && !dat_found; i++){
if (strdirdat == mem[i][0]/*str_pc_aux == mem[i][0]*/){
str_ac = mem[i][1];
ac = stoi(str_ac);
dat_found = true;
}
}
}
Solo falta arreglar lo de la funcion void deleteMem() para borrar la memoria alocada.