当我调用我的TruthTable类&填充它/输入时,当我试图设置和门的输入时,我无法访问数组中的各个插槽。
发生错误的threeAndGates.java -the类
import java.util.Scanner;
public class threeAndGates {
public static void main(String[] args){
LogicGate and1 = new LogicGate(LogicGate.AND);
LogicGate and2 = new LogicGate(LogicGate.AND);
LogicGate and3 = new LogicGate(LogicGate.AND);
System.out.print("What is the number of Inputs? ");
Scanner scan = new Scanner(System.in);
int numOfInputs = scan.nextInt();
System.out.print("What is the number of Outputs? ");
int numOfOutputs = scan.nextInt();
TruthTable Table1 = new TruthTable(numOfInputs,numOfOutputs);
Table1.PopulateTruthTable();
//below is where it is giving me "the type of the expression must be an array type but it resolves to TruthTable"
for(int r = 0; r<(Math.pow(2, numOfInputs)) ; r++ ){
and1.setInput1(Table1[r][0]);
and1.setInput2(Table1[r][1]);
and2.setInput1(Truth1[r][2]);
and2.setInput2(Truth1[r][3]);
and3.setInput1(and1.getOutput());
and3.setInput2(and2.getOutput());
Table1[r][numOfInputs + numOfOutputs] = and3.getOutput();
}
Table1.printTruthTable();
}
}TruthTable.java
public class TruthTable {
private int numOfInputs;
private boolean[][] table;
public TruthTable(int inputs, int outputs){
this.numOfInputs = inputs;
int rows = (int) Math.pow(2,inputs);
int columns = inputs + outputs;
table = new boolean[rows][columns];
}
public void printTruthTable(){
for(int r = 0 ; r < table.length ; r++){
for(int c = 0; c < table[r].length; c++)
System.out.printf("%-5b ", table[r][c]);
System.out.println();
}
}
public String toString(){
String outStr = new String();
for(int r = 0; r < table.length; r++){
for(int c = 0; c < table[r].length; c++)
outStr += String.format("%-5b ", table[r][c]);
outStr += '\n';
}
return outStr;
}
public boolean[][] PopulateTruthTable(){
String s;
String r ="";
int[] Line = new int[numOfInputs];
boolean bit;
for ( int i= 0; i < Math.pow(2,numOfInputs) ; i++){
int x = numOfInputs - Integer.toBinaryString(i).length();
for(int j = 0; j<x ; j++)
r += "0";
s = r + Integer.toBinaryString(i);
for(int k=0; k<s.length() ;k++){
Line[k] = s.charAt(k)-48;
}
for(int m=0 ; m<numOfInputs ; m++){
if(Line[m]==1) bit = true;
else bit = false;
table[i][m] = bit;
}
r="";
}
return table;
}
}发布于 2012-06-29 19:24:46
您的TruthTable类不是数组。它包含一个数组。可以将get和set方法添加到TruthTable类中:
public boolean getValueAt(int x, int y) {
return this.table[x][y];
}
public void setValueAt(int x, int y, boolean value) {
this.table[x][y] = value;
}并使用它来处理TruthTable值。
这与您的问题无关,但是在您的类中命名变量时,通常的做法是使用小写。例如,您有:
TruthTable Table1 = new TruthTable(numOfInputs,numOfOutputs);会更好
TruthTable table1 = new TruthTable(numOfInputs,numOfOutputs);可能是最好的
TruthTable truthTable = new TruthTable(numOfInputs,numOfOutputs);你说的东西越好,越连贯,你就越容易阅读下去。
发布于 2012-06-29 19:25:06
您的TruthTable类不是多维数组;它有一个多维数组字段。因此,您不能使用以下语法:
tableInstance[x][y]如果TruthTable的表字段是公共的,或者更好的是,它有一个getter,那么您可以这样做.
tableInstance.getTable()[x][y]有些语言(如C#)也支持操作符重载,这将允许您定义使用[]索引运算符(或其他如+、/等)的行为。这将允许您使索引工作。不幸的是,Java没有这个特性。
发布于 2012-06-29 19:51:07
这与其说是回答,不如说是评论,但我需要更多的空间。
如果您的代码稍后会导致问题,我可以提出建议吗?将populateTruthTable分解为2或3个方法,将每个循环放入自己的好命名方法中,因为每种方法都应该做一件事。
此外,您可能不应该直接从主类访问数组,而应该将主类"for“循环中的所有代码放入TruthTable类中的方法中,并从告诉一个对象该做什么,而不是要求它的数据。调用该方法,因为您应该使用告诉一个对象该做什么,而不是要求它的数据。。
我并不是说你做错了什么,你显然做得很好,但随着时间的推移,学到更多的编码技巧/实践总是很好的,而且你似乎已经达到了这些有用的水平。
https://stackoverflow.com/questions/11267281
复制相似问题