# Upn-Rechner



## F34RL355 (19. Nov 2009)

Bin gerade dabei einen Upn Rechner zu erstellen...

Hab dafür einen eigene Klasse Stack mit Hilfe eines Arrays implementiert.

```
class Stack{

final int max = 20;
int [] stack = new int [max];
int size = 0;

public void push(int n){
stack[size++] = n;
}
public int pop(){
return stack[--size];
}

public boolean hasNext(){
return size != 0; 
}

//public String toString()

}
```

Nun hab ich noch eine Klasse, mit der Methode "readOperand" welche einen eingegebenen Int Wert auf den Stack ablegen soll. 


```
class UpnCalculator{
  
  Stack stapel = new Stack();

  public void readOperand(int a){
  a.push();
}

public int readOperator(int operator){
    int zahl1 = stapel.pop(); 
  
}

}
```


```
UpnCalculator.java:7: int cannot be dereferenced
  a.push();
   ^
1 error
```

Kann mir da vll. jemand weiterhelfen


----------



## Arbon (19. Nov 2009)

Deine Methode push erfordert einen int als Argument, du übergibst ihm allerdings beim Aufruf mittels a.push(); gar nichts. Das nächstes problem ist, dass a ein int ist und nicht dein Stapel. also würde die Methode warscheinlich stapel.push(a); lauten, welche du eigendlich aufrufen möchtest.


----------



## F34RL355 (19. Nov 2009)

Arbon hat gesagt.:


> Deine Methode push erfordert einen int als Argument, du übergibst ihm allerdings beim Aufruf mittels a.push(); gar nichts.



Na klar !


```
stapel.push(a);
```

Ich bin ein Koffer  DANKE !


----------



## madboy (19. Nov 2009)

korrekt wäre

```
stappel.push(a);
```
a ist ein int und da gibt's keine Methode namens push


----------



## Leroy42 (19. Nov 2009)

Das muß *stappel.push(a)* heißen.

Übrigens:

- stappel sollte stapel heissen.
- Du fragst bei *push* nicht ab, ob dein size auch nicht größer als dein *max* wird-


----------



## Civilazi (19. Nov 2009)

Die Fehlermeldung sagt dir doch alles, was du brauchst. Du kannst nicht einfach eine objektmethode (push) von einem int aufrufen wollen. Wenn dir das nicht klar ist, google mal nach primitiven Datentypen. Du willst da stapel.push(a);        (Stapel nur mit einem 'p')

EDIT: Ach Mist, einmal beim Beitragschreiben weggegangen und schon ist man einige Beiträge zu spät.


----------



## F34RL355 (19. Nov 2009)

Danke euch allen !!

Bin selber grad draufkommen dass ich mich bei "stappel" verschrieben hab ^^

Auch danke für den Tipp, dass ich bei push das max nicht überprüf, hab das gleich geändert ...


```
final int max = 19;
  int [] stack = new int [max];
  int size = 0;
  String ans = "";
  
  public void push(int n){
    if (size ==20){
    ans = "false";}
    stack[size++] = n;
  }
```


----------



## Leroy42 (19. Nov 2009)

```
public void push(int n){
    if (size ==max) {
        System.out.println("Fehler: Stack läuft über";
        return;
   }
    stack[size++] = n;
  }
```


----------



## F34RL355 (19. Nov 2009)

So eine Frage hab ich jetzt noch:


```
class Stack{
  
  final int max = 19;
  int [] stack = new int [max];
  int size = 0;
  String ans = "";
  
  public void push(int n){
    if (size ==20){
      ans = "false";
    }
    stack[size++] = n;
  }
  public int pop(){
    return stack[--size];
  }
  
  public boolean hasNext(){
    return size != 0; 
  }
  
  public String toString(){
  return "0 = " + stack[0];  
  
  }    
}
```


```
class UpnCalculator{
  
  Stack stapel = new Stack();

  public void readOperand(int a){
  stapel.push(a);
}

public void readOperator(int operator){
    int zahl1 = stapel.pop();
    int zahl2 = stapel.pop();
    
    int sum = zahl1+zahl2;
    
    stapel.push(sum);
  
}
}
```

ZUM TESTEN:


```
import java.util.Scanner;

class UpnApplication{

public static void main (String [] args){

 
  Scanner reader = new Scanner(System.in);
  
Stack stapel = new Stack();   
UpnCalculator test = new UpnCalculator();

stapel.push(5);
stapel.push(2);
test.readOperator(1);

System.out.print(stapel);

}
}
```


```
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
        at Stack.pop(Stack.java:15)
        at UpnCalculator.readOperator(UpnCalculator.java:10)
        at UpnApplication.main(UpnApplication.java:15)
```


----------



## F34RL355 (19. Nov 2009)

Kanns vielleicht sein, dass ich 2 unterschiedliche Stacks hab und ich mich deshalb bei "readOperator" in einem anderen Stack befind, dass noch gar keine Daten enthält ?


----------



## Ein Keks (19. Nov 2009)

jep genau das ist das problem test hat eine instanz von stack du addest aber nur auf die instanz in UpnApplication und willst dann von der instanz aus test auslesen


----------



## F34RL355 (19. Nov 2009)

Okay, Danke !

Ich steh aber grad ein bissl an, hättest du vielleich einen kleinen Hinweis für mich, wie ich das richtig hinbekomm :bahnhof:

Nur ein kleiner Schubser in die richtige Richtung


----------



## F34RL355 (20. Nov 2009)

Irgendwer ?


----------



## faetzminator (20. Nov 2009)

Du kannst doch einfach statt ersterem letzteres schreiben?

```
stapel.push(5);
stapel.push(2);
test.readOperator(1);
```


```
test.readOperand(5);
test.readOperand(2);
test.readOperator(1);
```


----------



## F34RL355 (20. Nov 2009)

Vielen Dank ^^ Da hätt ich eigentlich selber draufkommen müssen ...!


```
public String toString(){
   for (int i=0; i<=size; i++){
   return stack[i] + "\n";   }
}
```

Haste vll. auch einen Tipp für das Problem ! Ich würd gern die Elemente des Stacks ausgeben, wobei nach jedem ein Zeilenvorschub sein soll !

mit System.out.print wärs ja einfach, aber gibts auch 'ne möglichkeit mit return ??


----------



## faetzminator (20. Nov 2009)

Ich würd so was machen:

```
public String toString() {
    String str = "[";
    for (int i = 0; i <= size; i++) {
        str += "\n\t" + stack[i];
    }
    str += "\n]";
    return str;
}
```


----------

