Here is my main problem. I am simulating a process with a register, memory and a constant value
when calling the following code from app.class
new Set(new Reg("A"),new Reg("B")),
new Set(new Reg("A"),new Mem(20)),
new Set(new Reg("A"),new Val(2000)),
new Set(new Mem(10),new Reg("B")),*/
new Set(new Mem(10),new Mem(20)),
new Set(new Mem(10),new Val(2000))
it's supposed to return the values from method getReg, getMemoryElmt from Machine class but unfortunately I get this kind of error message :
0. Set (Tp3.Mem@28a418fc, Tp3.Mem@5305068a)
1. Set (Tp3.Mem@1f32e575, Tp3.Val@279f2327)
0
0
0
0
Set (Tp3.Mem@28a418fc, Tp3.Mem@5305068a)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 20 out of bounds for length 4
at Tp3.Machine.getMemoryElmt(Machine.java:70)
at Tp3.Mem.readValue(Mem.java:17)
at Tp3.Set.execute(Set.java:22)
at Tp3.Machine.step(Machine.java:42)
at Tp3.App.main(App.java:20)
Now I don't know if the problem is the problem is from the methods of machine.java or the methods readValue/setValue from Reg/Val/Mem class
App class containing Main
public class App {
public static void main(String[] args) {
Machine m = new Machine(4);
m.setProgram(
new Set(new Reg("A"),new Reg("B")),
new Set(new Reg("A"),new Mem(20)),
new Set(new Reg("A"),new Val(2000)),
new Set(new Mem(10),new Reg("B")),
new Set(new Mem(10),new Mem(20)),
new Set(new Mem(10),new Val(2000))
);
m.printProgram();
System.out.println();
do {
m.printMemory();
System.out.println();
} while (m.step());
m.printMemory();
}
}
Execute method from Set launching execution
public class Set extends Instruction {
private Ecriture e;
private Lecture l;
Set(Ecriture e,Lecture l) {
this.e = e;
this.l = l;
}
@Override
public String toString() {
return "Set (" + e + ", " + l + ")";
}
@Override
boolean execute(Machine m) {
System.out.println(this);
e.setValue(m, l.readValue(m));
return true;
}
}
Machine class
public class Machine {
private List<Instruction> instructions;
private int[] memory;
private int current;
private HashMap<String,Integer>reg;
public Machine(int memorySize) {
memory = new int[memorySize];
reg = new HashMap<String,Integer>();
instructions = new ArrayList<>();
reset();
}
public void setProgram(Instruction... args) {
for (int i = 0; i < args.length; i++)
instructions.add(args[i]);
}
public void printProgram() {
System.out.println(current + ". " + instructions.get(current));
while (nextInstruction()) {
System.out.println(current + ". " + instructions.get(current));
}
reset();
}
public void printMemory() {
for (Integer i : memory) {
System.out.println(i);
}
}
public boolean step() {
return instructions.get(current).execute(this);
}
boolean nextInstruction() {
if (current < instructions.size() - 1) {
current++;
return true;
} else
return false;
}
boolean setCurrent(int index) {
if (index < instructions.size()) {
current = index;
return true;
}
return false;
}
int getCurrent() {
return current;
}
int getMemorySize() {
return memory.length;
}
int getMemoryElmt(int index) {
return memory[index];
}
boolean setMemory(int index, int value) {
if (index < memory.length) {
memory[index] = value;
return true;
}
return false;
}
int getReg(String index) {
return reg.get(index);
}
boolean setReg(String value, int index) {
if(value!=null) {
reg.put(value,index);
return true;
}
return false;
}
void reset() {
current = 0;
}
}
Registre class
public class Reg implements Lecture,Ecriture{
private String registre;
public Reg(String r){
this.registre = r;
}
public String getReg() {
return registre;
}
@Override
public void setValue(Machine m, int v) {
m.setReg(this.getReg(), v);
}
@Override
public int readValue(Machine m) {
return m.getReg(this.getReg());
}
}
Mem class
public class Mem implements Lecture,Ecriture{
private int memory;
public Mem(int mem) {
this.memory = mem;
}
public int getMem() {
return memory;
}
@Override
public int readValue(Machine m) {
return m.getMemoryElmt(this.getMem());
}
@Override
public void setValue(Machine m, int v) {
m.setMemory(this.getMem(), v);
}
}
Val class
public class Val implements Lecture{
private int value;
public Val(int v) {
this.value = v;
}
public int getVal() {
return value;
}
@Override
public int readValue(Machine m) {
// TODO Auto-generated method stub
return getVal();
}
}