Autor Beitrag
LINUS19
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 129
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: So 28.01.18 15:35 
Hallo,
ich wollte einen sehr einfachen Übersetzer für Brainfuck in Java machen(de.wikipedia.org/wiki/Brainfuck).
Hello World(++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.) zu übersetzen funktioniert, oder auch Zeichen einlesen und wieder ausgeben([,.]), aber bei anderen Programmen hängt es sich auf oder gibt ein ArrayIndexoutBoudsException züruck.
Hier die Interpretiere Methode:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
public static char[] interpretiere(char array[]) throws IOException {

    DataInputStream input = new DataInputStream(System.in);
    DataOutputStream out = new DataOutputStream(System.out);

    int speicher[] = new int[32000];
    int zeiger = 0;

    for (int i = 0; i < array.length; i++) {
      
      switch (array[i]) { // alle 8 Befehle

      case '.': 
        System.out.print((char) (int) speicher[zeiger]); // Ausgabe        
        break;

      case ',': // Zahl wird eingelesen
        speicher[zeiger] = (char) input.read();        
        break;

      case '[': Schleife
        int n = 1;
        while (n > 1)
          if (speicher[zeiger] == 0) {
            if (array[++i] == ']')
              n--;
          } else if (speicher[zeiger] == '[') {
            n++;
          }
        break;

      case ']':
        int m = 1;
        while (m > 0 && speicher[zeiger] != 0) { 
          if (array[--i] == '[') {
            m--;
          } else if (array[i] == ']')
            m++;
        }
        break;

      case '>':
        zeiger++;
        break;

      case '<':
        zeiger--;        
        break;

      case '+': // Speicherzelle wird um 1 erhöht
        speicher[zeiger]++;        
        break;

      case '-': // Speicherzelle wird um 1 erniedrigt
        speicher[zeiger]--;        
      }

    }
    return array;

  }

Schonmal Danke im Vorraus

LG
LINUS19
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 28.01.18 17:22 
Guten Abend LINUS19,

in welcher Zeile wird die Exception ausgelöst? Wenn du ArrayIndexoutBoudsException liest, was könnte das bedeuten bzw. was ist der Grund dafür, dass diese Exception überhaupt auftritt?

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 129
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: So 28.01.18 19:51 
Guten Abend Frühlingsrolle,

In welcher Zeile das Auftritt weißich nicht mehr, weil ich einige Programme getestet hab und nicht mehr weiss wo der Fehler auftrat. Die Fehlermeldung bedeutet ja dass das Array einen falschen Index hat. Wahrscheinlich ist mit den Schleifen,also mit '[' und ']', auch noch was falsch, weil das Programm sonst ja nicht manchmal in eine Endlosschleife geraten würde.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 28.01.18 20:04 
Die Exception würde auf Deutsch sinngemäß - Array Index außerhalb des Grenzbereichs - heißen. Weil du dich an die Fehlerstelle nicht erinnerst, müssen wir uns den Quelltext durchlesen.
In Zeile 25 fällt mir u.a. folgendes auf:

ausblenden Java-Quelltext
1:
if (array[++i] == ']')					

wobei i wie folgt gezählt wird:

ausblenden Java-Quelltext
1:
for (int i = 0; i < array.length; i++)					

Jetzt stell' dir vor, die Schleife erreicht das letzte Element, also i = array.Length - 1, und du fragst array[++i] nach etwas ab. Meinst du nicht, dass du an dieser Stelle die Länge des Arrays überschreitest?

Für kommenden Themen, vergiss nicht, nicht nur die Fehlermeldung zu nennen, sondern auch die Stelle, an der sie auftritt. Manchmal sind die Fehlerstellen nicht so offentsichtlich. In dem Fall musst du das Projekte stellenweise debuggen. Solltest du das Debuggen nicht verstehen, erstell' dazu ein neues Thema, und wir erklären es dir gerne.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: LINUS19
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 129
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: So 28.01.18 22:24 
Ich habe das jetzt so geändert: if (array[++i] == ']' && i<array.length) , bei case '+', '-' und '[' war es ja auch das selbe Problem, trotzdem taucht bei einigen Programmen eine Endlosschleife auf.
z.B bei diesem Programm, es soll das Sierpinski Dreieck ausgeben:
ausblenden Quelltext
1:
2:
3:
4:
5:
 ++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[
    -<<<[
        ->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<<
    ]>.>+[>>]>+
]

Es läuftt einfach immer weiter nd es passiert nichts(auch keine Fehlermeldung).
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 28.01.18 23:13 
Wegen der Endlosschleife muss ich mal schauen. Für mich steht fest, dass die case-Anweisung für das Zeichen '[' nie erfüllt wird, denn:

ausblenden Java-Quelltext
1:
2:
3:
4:
case '['
    int n = 1;     // wenn "n" = 1 ist
    while (n > 1)  // kann "n" hier nie > 1 sein/werden
    // ...

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: LINUS19
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 129
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: So 28.01.18 23:17 
Stimmt das muss n>0 sein.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 28.01.18 23:30 
Ja, genau. Mal abgesehen davon, sehe ich keinen Nutzen darin, die Variable rauf und runter zu zählen. Du verwendest sie auch für sonst nichts. Benutze doch stattdessen eine Boolean-Variable.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 129
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: So 28.01.18 23:51 
Das soll für in einnander geschachtelten Schleifen sein.
Wahrscheinlich kommt wegen den geschachtelten Schleifen weiter oben,die Endlosschleife zustande.Bei Helloworld funktioniert die Schleife ja.

Edit: Bin das jetzt mit dem Debugger durchgegangen und die while() Schleife bei bei case'[' wird nicht verlassen.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 29.01.18 17:32 
Ich denke mal, weil er die ganze Zeit an der gleichen Stelle sucht/schreibt. Erhöhe doch das i++, bevor es ins while geht. Und beim ']' verminderst du das i-- an der gleichen Stelle.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 129
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Mo 29.01.18 17:50 
Habe es jetzt verändert. aber das Programm befindet sich immer noch in einer Endlosschleife.
Wäre es übersichtlicher einen Stack für die Schleifen zu verwenden?
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 29.01.18 21:47 
Nein, wozu. Man kann sich die Werte im Debugger anschauen. Ich probier mal ein eigenes Projekt, denn hier ist mir die "Baustelle" zu groß. :D Bis bald.

Nachtrag

ausblenden volle Höhe Java-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
public static String Interpretiere(String bfText, String input) {
    
    final int MAX_ZEICHEN = 32000;
    byte[] speicher = new byte[MAX_ZEICHEN];
    int zeiger = 0, schleifen = 0;
    String ausgabe = "";
    
    for (int i = 0; i < bfText.length(); i++) {
      
        switch (bfText.charAt(i)) {
      
        case '+':
            speicher[zeiger]++;
            break;
        
        case '-':
            speicher[zeiger]--;
            break;
        
        case '>':
            zeiger++;
            break;
        
        case '<':
            zeiger--;
            break;
        
        case '[':
            if (speicher[zeiger] == 0) {
          
                i++;
                while (schleifen > 0 || bfText.charAt(i) != ']') {
            
                    if (bfText.charAt(i) == '[')
                        schleifen++;
                    else if (bfText.charAt(i) == ']')
                        schleifen--;
                    i++;
                }
            }
            break;
      
        case ']':
            if (speicher[zeiger] != 0) {
          
                i--;
                while (schleifen > 0 || bfText.charAt(i) != '[') {
            
                    if (bfText.charAt(i) == ']')
                        schleifen++;
                    else if (bfText.charAt(i) == '[')
                        schleifen--;
                    i--;
                }
                i--;
            }
            break;
        
        case ',':
            if (input != null || !input.isEmpty())
                for (int iPos = 0; iPos  < input.length(); iPos++) {

                    speicher[zeiger] = (byte)input.charAt(iPos);
                    zeiger++;
                }
            break;

        case '.':
            ausgabe += (char)speicher[zeiger];
            break;
        }
    }
    return ausgabe;
}

// Aufruf
public static void main(String[] args) {
    // TODO Auto-generated method stub
    String bfText = "++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[\n" +
        "-<<<[\n" +
        "->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<<\n" +
        "]>.>+[>>]>+\n" +
        "]";
    bfText = Interpretiere(bfText, null);
    System.out.print(bfText);  // => Sierpinski Dreieck
}

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)


Zuletzt bearbeitet von Frühlingsrolle am Do 01.02.18 02:50, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: LINUS19
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 129
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Di 30.01.18 18:20 
Danke dir. Strings zu verwenden ist natürlich besser als char, weil man dann auch die ganzen Stringmethoden hat(z.B charAt() wie du verwendet hast).
Ich verstehe nur nicht, warum du ein Bytearray nimmst und nicht ein int Array. Was ist der Vorteil davon?
Und muss man nicht den zeiger und den speicher bei bestimmten Fällen wieder auf Null setzen, damit kein Überlauf entsteht?
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 30.01.18 21:13 
Einem char-Array etwas zuzuweisen ist auf direktem Wege mehr Arbeit, als stattdessen einen String zu benutzen:

ausblenden Java-Quelltext
1:
2:
3:
4:
char[] c = { '+''>''+''.' };
// bzw.
String s = "+>+.";
char[] c = s.toCharArray();

So hast du mehr Schreibarbeit, wenn dein Eingabe-Parameter ein char[] ist.

Da hier ANSI Zeichen verarbeitet werden, und diese im Bereich von 0-255 liegen, bietet sich das byte[] eher an als das int[].
Die Variable speicher merkt sich dabei den Ordinalwert jedes dieser Zeichen. Konvertiert man einen dieser Werte nach char, kommt das entsprechende Zeichen dafür heraus.
Um zu verstehen: A = 65, Z = 90, a = 97, z = 122.

Sollte es zum Überlauf kommen, also sollte der BF-Text mehr Zeichen ergeben als der Grenzwert MAX_ZEICHEN, dann sollte die Variable zeiger auf 0 gesetzt werden. Das wäre in der case-Anweisung: '>' der Fall.
Man kann es auch umgehen, indem man vorher abfragt, ob die Eingabe mehr als MAX_ZEICHEN enthält. Dann kann man eine Exception mit throw werfen, noch bevor der eigentliche Code anfängt, und die Funktion liefert im Fehlerfall null.
Oder man fragt nach, ob die Eingabe <= dem Grenzwert ist und führt erst dann den Code aus. Die Funktion sollte im Fehlerfall einen leeren String liefern.

Anstelle des byte[] könntest du ebenso eine List<Byte> anlegen:

ausblenden Java-Quelltext
1:
2:
3:
import java.util.*;

List<Byte> speicher = new ArrayList<Byte>();

Der Grenzwert liegt hier bei Integer.MAX_VALUE. So lange darf auch ein String sein.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: LINUS19
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 129
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Di 30.01.18 22:49 
Mir ist gerade aufgefallen das bei deinem Programm die Eingabe nicht funktioniert. Z,b bei diesem Programm: [,.]
werden keine Zeichen eingelsen.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 30.01.18 23:01 
Das allein [,.] ergibt auch nichts. Versuch's in einem anderen BF-Converter, wie hier.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 129
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Di 30.01.18 23:25 
sorry habe mich versehen. Aber diese Bubblesort Programm gibt bei deinem Programm String index out of range aus, in Zeile 66 dort wo die Zeichen eingelsen werden und funktioniet z,B bei diesem Compiler: sange.fi/esoteric/br...k/impl/interp/i.html

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
>>,[>>,]<<[
[<<]>>>>[
<<[>+<<+>-]
>>[>+<<<<[->]>[<]>>-]
<<<[[-]>>[>+<-]>>[<<<+>>>-]]
>>[[<+>-]>>]<
]<<[>>+<<-]<<
]>>>>[.>>]
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 30.01.18 23:32 
Das musst du mir zeigen. :gruebel: 1:1 kopiert ergibt das auf deiner verlinkten Seite nichts, also eine leere output-Box. Ebenso auf meiner Seite.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 129
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Di 30.01.18 23:49 
Hier ein Screenshot:
Einloggen, um Attachments anzusehen!
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 30.01.18 23:53 
Hm, und was passiert da? Wo kommt z.B. die 0 auf einmal vor deiner Eingabe? Die ist ganz hinten die 0. Macht Sinn, nur muss vorher die Zahl, also dein Input auch in BF vor diesem Code erfolgen, damit der gepostete Code hier auch was damit anfangen kann.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)