2012-06-29 2 views
2

Когда я вызываю свой класс 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; 
    } 
} 

ответ

2

Ваш TruthTable класс не является массивом. Он содержит массив. Вы можете добавить получить и установить метод вашего 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); 

Чем лучше и более последовательно вы называете вещи, тем легче будет, чтобы прочитать вниз Дорога.

+0

+! - Хороший совет с соглашениями об именах! Это не только поможет вам прочитать свой собственный код в будущем, но и поможет нам, чтобы пользователи SO помогли вам быстрее решить ваши проблемы, потому что мы тоже быстрее понимаем ваш код! –

+0

Просто подсветка кода правильна, поэтому мне намного легче обрабатывать, я, вероятно, должен был заметить, что имена классов также должны начинаться с прописных букв, но я думал, что мой пост уже длинный. –

+0

Я знаю, что вы имеете в виду. Даже имена методов были в верхнем регистре: 'Table1.PopulateTruthTable();' :( –

1

Ваш класс TruthTable не является многомерным массивом; он имеет многомерное поле массива. Для этого, вы не можете использовать следующий синтаксис:

tableInstance[x][y] 

Если поле таблицы вы TruthTable было публично, или еще лучше, это было поглотитель, вы могли бы сделать womthing как это вместо того, чтобы ...

tableInstance.getTable()[x][y] 

Некоторые языки (например, C#) также поддерживают перегрузку оператора, которая позволит вам определить поведение оператора [] (или других, таких как +, / и т. Д.). Это позволит вам сделать работу индексации. К сожалению, Java не имеет этой функции.

1

Это скорее комментарий, чем ответ, но мне нужно больше места.

Если ваш код вызывает у вас проблемы позже, могу ли я сделать предложение? Разбить populateTruthTable на 2 или 3 метода, поместив каждый цикл в собственный собственный метод, потому что Each method should do exactly one thing

Также вы, вероятно, не должны получать доступ к массиву непосредственно из основного класса, вместо этого поместите весь код из своих основных классов " за "цикл в метод в классе TruthTable и вызов этого метода из main, потому что вы должны Tell an object what to do rather than asking for it's data.

Я не пытаюсь сказать, что вы делаете это неправильно или что-то еще, вы, очевидно, очень хорошо себя чувствуете, но это всегда хорошо подобрать больше кодовых трюков/практик, пока вы идете вперед, и вам кажется, что вы на том уровне, где это пригодится.

+0

+1 Очень хорошо сказано и конструктивно. –

Смежные вопросы