Autor Beitrag
LINUS19
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: So 28.01.18 16: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 28.01.18 18:22 
- Nachträglich durch die Entwickler-Ecke gelöscht -
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: So 28.01.18 20: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 28.01.18 21:04 
- Nachträglich durch die Entwickler-Ecke gelöscht -

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

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: So 28.01.18 23: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.01.18 00:13 
- Nachträglich durch die Entwickler-Ecke gelöscht -

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

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Mo 29.01.18 00:17 
Stimmt das muss n>0 sein.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.01.18 00:30 
- Nachträglich durch die Entwickler-Ecke gelöscht -
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Mo 29.01.18 00: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.01.18 18:32 
- Nachträglich durch die Entwickler-Ecke gelöscht -
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Mo 29.01.18 18: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.01.18 22:47 
- Nachträglich durch die Entwickler-Ecke gelöscht -


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

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

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Di 30.01.18 19: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 30.01.18 22:13 
- Nachträglich durch die Entwickler-Ecke gelöscht -

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

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Di 30.01.18 23:49 
Mir ist gerade aufgefallen das bei deinem Programm die Eingabe nicht funktioniert. Z,b bei diesem Programm: [,.]
werden keine Zeichen eingelsen.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 31.01.18 00:01 
- Nachträglich durch die Entwickler-Ecke gelöscht -
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Mi 31.01.18 00: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 31.01.18 00:32 
- Nachträglich durch die Entwickler-Ecke gelöscht -
LINUS19 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 156
Erhaltene Danke: 1

Windows 10, 7
Java(Eclipse)
BeitragVerfasst: Mi 31.01.18 00:49 
Hier ein Screenshot:
Einloggen, um Attachments anzusehen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 31.01.18 00:53 
- Nachträglich durch die Entwickler-Ecke gelöscht -