Autor |
Beitrag |
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: 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:
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
|
Verfasst: So 28.01.18 18:22
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: 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
|
Verfasst: So 28.01.18 21:04
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: 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:
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
|
Verfasst: Mo 29.01.18 00:13
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Mo 29.01.18 00:17
Stimmt das muss n>0 sein.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 29.01.18 00:30
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: 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
|
Verfasst: Mo 29.01.18 18:32
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: 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
|
Verfasst: 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
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: 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
|
Verfasst: Di 30.01.18 22:13
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: 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
|
Verfasst: Mi 31.01.18 00:01
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: 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
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| >>,[>>,]<<[ [<<]>>>>[ <<[>+<<+>-] >>[>+<<<<[->]>[<]>>-] <<<[[-]>>[>+<-]>>[<<<+>>>-]] >>[[<+>-]>>]< ]<<[>>+<<-]<< ]>>>>[.>>] |
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 31.01.18 00:32
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Mi 31.01.18 00:49
Hier ein Screenshot:
Einloggen, um Attachments anzusehen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 31.01.18 00:53
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|