Zum Inhalt springen

Devilmarkus

Mitglieder
  • Gesamte Inhalte

    158
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Devilmarkus

  1. Hab es herausgefunden: /* the buffer */ int[] circlebuffer = new int[2000]; /* write position */ int writepos = (2000 - 1); /* read position */ int readpos = 0; /* write value into buffer and update write position */ void buffer_write(int val) { circlebuffer[writepos] = val; writepos = (writepos + 1) % circlebuffer.length; } /* read value from buffer and update read position */ int buffer_read() { int val = circlebuffer[readpos]; readpos = (readpos + 1) % circlebuffer.length; return val; } In meiner Routine rufe ich nun Dieses hier auf: if (Switches.dbeffect){ buffer_write(rightChannel); rightChannel = buffer_read(); } player.writeStereo(leftChannel, rightChannel);
  2. Nunja, im Prinzip ist es doch egal, aus welchem Framework dies kommt. Es könnte auch ein ganz normaler Buffer sein, nicht für Audio sondern eine andere Verzögerung. Hier nun die gesamte Klasse zu posten, wäre wirklich zu komplex. Ich werd mal versuchen, ein byte[] Array zu erschaffen, welches an letzter Stelle mit dem aktuellen Byte B gefüllt wird, wovon das erste Byte gespielt wird, und welches sich mit System.ArrayCopy(....) selbst verschiebt.
  3. Hallo zusammen, in meiner Routine verwende ich einen Audioplayer, welcher wie folgt aufgerufen wird: player.writeStereo(byte A, byte ; Nun habe ich folgendes Problem: Ich möchte ein "Pseudo Stereo" erreichen, mit einem gepufferten Kanal B. B ist identisch mit A, wenn ich Mono abspiele. Wie bastele ich mir nun einen Puffer dafür, so dass B mit 10ms Verzögerung abgespielt wird? MFG Markus
  4. Hallo, da ich keinen Mac habe, aber sehr viele Anfragen habe, folgende Frage: - Wie kann ich mit OS-X eine JAR starten mit folgenden Parametern? JavaCPC.jar -Xms256m -Xmx512m -XX:MaxPermSize=512m - Wie kann ich daraus eine .JNLP oder eine .sh Datei machen? Beispiel: Ordner zur .jar lautet: /Users/edu/Applications/jacpc/JavaCPC.jar Gruss, Markus
  5. Ich habe Teile eines vorhandenen Parsers verwendet und an meine Bedürfnisse angepasst / erweitert. Für das Wesentliche, was er können muss, nämlich genauso rechnen, wie der MAXAM-Z80 Assembler das kann, reicht er völlig aus... Der "Scientific Calculator" ist eigentlich nur ein Überbleibsel einer simplen Eingabe-GUI womit ich den Parser für meine Bedürfnisse getestet habe. (Ich war nur zu Faul, den wieder zu löschen)
  6. Danke, das ist auch hilfreicher für mich. Dinge wie "Aus Dokument soundso oder aus Regel soundso" nützen mir garnichts. - JavaDocs verstehe ich (noch) nicht. - Ich habe nie Java-Schulungen mitgemacht. - Alles, was ich in Java mache, habe ich mir selbst beigebracht (Trial & error) oder hier im Forum erfragt. 2^-pi ergibt: 0.11331473229676088 2^0.5 ergibt: 1.4142135623730951 ^0.5 ergibt: 0.5 (Ob es richtig ist, weiss ich nicht. Bin ein null-Mathematiker)
  7. Sollte nun alles funktionieren. Übrigens lustig: In meiner Benachrichtigungsmail wurde die letzte Aufgabe so abgeändert: 2²*2 = Err Auch dieser Fall sollte jetzt funktionieren. ² und ³ sollten korrekt gelesen werden.
  8. Zum "herumspielen" habe ich nun ein Applet gebastelt.... Scientific Calculator Applet
  9. Hier nun der komplette Parser: View Source Download Source Für den normalen User bleibt nur die Labelgeschichte zu entfernen (Zeilen 258 / 259) Viel Spass damit. (Er kann nun auch mit 'pi' rechnen!)
  10. Das Problem hat sich gelöst. Ich hatte vorher falsch geparst. Der jetzige Parser tut wie er soll. Ich kann sogar die Punkt-vor-Strich Rechnung abschalten. Das brauche ich für meinen eigentlichen Programmteil: Z80 Assembler. Der benötigt diesen Parser. Beispiel: DS &3318-&3301+4*14 DS bedeutet: er soll eine bestimmte Anzahl an (in diesem Fall) Nullen aneinanderreihen. Diese Rechnung ergibt nach "normaler" Regel 79! Allerdings soll der Assembler kompatibel zu einem 'echten' Z80 Assembler sein und deshalb keine Punkt-vor-Strich Rechnung machen, Also kommt als Ergebnis 378 heraus... (Macht einen gewaltigen Unterschied, ist aber in diesem Fall das gewünschte Ergebnis) Bild: Original Maxam-Assembler mit derselben Berechnung
  11. Ich hab es geändert. Du hattest Recht! Der Wert war zu ungenau. Input:2^sin(5^(3+5)) Result = 1.3403578848874218 Sollte nun akkurat sein. if (fun.equals("sin")) { expression = transformMinus("(" + Math.sin(Math.toRadians(calculatePostFix(generatePostFix(expression)))) + ")"); } else { if (fun.equals("cos")) { expression = transformMinus("(" + Math.cos(Math.toRadians(calculatePostFix(generatePostFix(expression)))) + ")"); } else { if (fun.equals("tan")) { expression = transformMinus("(" + Math.tan(Math.toRadians(calculatePostFix(generatePostFix(expression)))) + ")"); } } }
  12. Ja das kommt heraus, wenn man mit Radiant rechnet. Kleine Änderung in meinem Parser: Input:2^sin(5^(3+5)) Result = 1.3403513252683301 if (fun.equals("sin")) { expression = transformMinus("(" + Math.sin(calculatePostFix(generatePostFix(expression))* 0.0174532925) + ")"); } else { if (fun.equals("cos")) { expression = transformMinus("(" + Math.cos(calculatePostFix(generatePostFix(expression))* 0.0174532925) + ")"); } else { if (fun.equals("tan")) { expression = transformMinus("(" + Math.tan(calculatePostFix(generatePostFix(expression))* 0.0174532925) + ")"); } } } * 0.0174532925 um in Radiant umzurechnen.
  13. Liefert er mir: 0.5895869474760311 Richtig?
  14. Habs (mit klammern, sinus, cosinus, sqr, exponent usw) SourceForge.net Repository - [javacpc] View of /JavaCPC/src/jemu/util/ass/Parser.java
  15. In der Polnischen Notation werden die Operatoren VOR die Ziffern geschrieben, wie es aussieht. Ich benötige sie aber auch mittendrin... Ich weiss, dass der Code schwer zu verstehen/lesen ist. Mein Kopf raucht auch schon. Mir würde folgendes eventuell helfen: Beispiel: 10+20+3*5 Wenn man nun die 3*5 an den Anfang setzen würde (Also die letzte Berechnung) dann würde das gehen: 3*5+10+20 würde mir mein erwünschtes Ergebnis liefern. Irgendeine Idee, wie man also die letzte Operation abschneiden kann und der Aufgabe vorne an stellen kann? Begonnen habe ich: public static String parseMath(String input) { input = checkInput(input); try { int result = processEquation(input); return "" + result; } catch (IllegalArgumentException iae) { } return null; } public static String checkInput(String inp) { int ops = 0; char[] lastop = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}; for (int i = 0; i < inp.length(); i++) { for (int p = 0; p < validOperators.length; p++) { if (inp.charAt(i) == (char)validOperators[p]){ ops++; lastop[ops] = inp.charAt(i); break; } } } String firstop = ""+lastop[ops-1]; if (ops > 1){ String newString =""; } System.out.println(ops +" operations. Last operation was:"+lastop[ops-1]); return inp; } Dieser Code soll also die letze Rechenoperation vorne anstellen... Nur wie? *Kopfrauchtwiedoof*
  16. Hallo, ich habe folgendes Problem: Ich benötige für simple Rechenaufgaben einen MathParser. Bevor Ihr nun alle postet:"Google ist Dein Freund": Ich habe mir einen Wolf gegoogelt. Leider habe ich nur einen Ansatzweise geeigneten Parser gefunden und ihn für meine Bedürfnisse angepasst. (Ich möchte A: Keine Shareware verwenden und B: Keine neue Bibliothek einsetzen) Hier nun mein modifizierter Parser: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ //package jemu.util.ass; //import jemu.core.Util; public class MathParser { private static final char[] validOperators = {'/', '*', '+', '-', '^'}; private MathParser() { } public static int evaluate(String leftSide, char oper, String rightSide) throws IllegalArgumentException { // leftSide = Z80Assembler.setLabels(leftSide); // leftSide = Z80Assembler.putEQU(leftSide); // rightSide = Z80Assembler.setLabels(rightSide); // rightSide = Z80Assembler.putEQU(rightSide); // leftSide.replace("#", "&"); // leftSide.replace("$", "&"); // rightSide.replace("#", "&"); // rightSide.replace("$", "&"); // if (leftSide.startsWith("&")) { // try { // leftSide = "" + Util.hexValue(leftSide.replace("&", "")); // } catch (Exception e) { // } // } // if (rightSide.startsWith("&")) { // try { // rightSide = "" + Util.hexValue(rightSide.replace("&", "")); // } catch (Exception e) { // } // } // System.out.println("Evaluating: " + leftSide + " (" + oper + ") " + rightSide); int total = 0; int leftResult = 0; int rightResult = 0; int operatorLoc = findLastOperatorLocation(leftSide); if (operatorLoc > 0 && operatorLoc < leftSide.length() - 1) { leftResult = evaluate(leftSide.substring(0, operatorLoc), leftSide.charAt(operatorLoc), leftSide.substring(operatorLoc + 1, leftSide.length())); } else { try { leftResult = Integer.parseInt(leftSide); } catch (Exception e) { throw new IllegalArgumentException("Invalid value found in portion of equation: " + leftSide); } } operatorLoc = findOperatorLocation(rightSide); if (operatorLoc > 0 && operatorLoc < rightSide.length() - 1) { rightResult = evaluate(rightSide.substring(0, operatorLoc), rightSide.charAt(operatorLoc), rightSide.substring(operatorLoc + 1, rightSide.length())); } else { try { rightResult = Integer.parseInt(rightSide); } catch (Exception e) { throw new IllegalArgumentException("Invalid value found in portion of equation: " + rightSide); } } // System.out.println("Getting result of: " + leftResult + " " + oper + " " + rightResult); switch (oper) { case '/': total = leftResult / rightResult; break; case '*': total = leftResult * rightResult; break; case '+': total = leftResult + rightResult; break; case '-': total = leftResult - rightResult; break; case '^': total = (int)Math.pow(leftResult, rightResult); break; default: throw new IllegalArgumentException("Unknown operator."); } // System.out.println("Returning a result of: " + total); return total; } private static int findOperatorLocation(String string) { int index = -1; for (int i = validOperators.length - 1; i >= 0; i--) { index = string.indexOf(validOperators[i]); if (index >= 0) { return index; } } return index; } private static int findLastOperatorLocation(String string) { int index = -1; for (int i = validOperators.length - 1; i >= 0; i--) { index = string.lastIndexOf(validOperators[i]); if (index >= 0) { return index; } } return index; } public static int processEquation(String equation) throws IllegalArgumentException { return evaluate("0", '+', equation); } public static String parseMath(String input) { try { int result = processEquation(input); return "" + result; } catch (IllegalArgumentException iae) { } return null; } public static int parseMaths(String input) { try { int result = processEquation(input); return result; } catch (IllegalArgumentException iae) { } return 0; } public static void main(String[] args) { String usage = "Usage: java MathParser equation\nWhere equation is a series" + " of integers separated by valid operators (+,-,/,*)"; if (args.length < 1 || args[0].length() == 0) { System.out.println(usage); String calc = "10+20-4"; int result = MathParser.processEquation(calc); System.out.println("The result of your equation (" + calc + ") should be: 26 is: " + result); calc = "20-10+4"; result = MathParser.processEquation(calc); System.out.println("The result of your equation (" + calc + ") should be: 14 is: " + result); calc = "20-2+4*4"; result = MathParser.processEquation(calc); System.out.println("The result of your equation (" + calc + ") should be: 34 is: " + result); calc = "3^13"; result = MathParser.processEquation(calc); System.out.println("The result of your equation (" + calc + ") should be: 1594323 is: " + result); } else { String equation = args[0]; try { int result = MathParser.processEquation(equation); System.out.println("The result of your equation (" + equation + ") is: " + result); } catch (IllegalArgumentException iae) { System.out.println(iae.getMessage() + "\n" + usage); } } } } Das Problem ist: Er soll einfach nur simpel rechnen, nichts aussergewöhnliches. (Klammern, andere Logarithmische Funktionen werden nicht benötigt) Nur ist das Resultat nicht immer wie erwünscht: Wenn jemand einen Plan hat, dieses hier zu ändern, wäre ich dafür sehr dankbar! Gruss, Markus P.s: Ich habe einige "Programmspezifischen" Sachen weg markiert, damit jeder diesen Code kompilieren kann.
  17. 500 Z80 Zyklen? (virtuelle) :floet: Nein, im Ernst, kann nichts bieten... Wenn, dann macht das jemand aus Spass an der Freude.
  18. Dank schon so einiger Tips hier, habe ich nun meinen Z80 Assembler/Disassembler so gut wie fertig... Video: JavaCPC Assembler / Disassembler Test Wer hat Lust, meinen Code zu überschauen und eventuell zu optimieren? :old :cool:
  19. Kann es sein, dass Du Deine Routine bis zum Erbrechen immer wieder aufrufst? public void doThis(){ doThis; } :upps
  20. Habe es nun so: for (int p = 0; p < line; p++) { compiledLine[p] = removeSpaces(compiledLine[p]); int check = compiledLine[p].indexOf(";"); if (check != -1) compiledLine[p] = compiledLine[p].substring(0, check); } Ergebnis: http://cpc-live.com/disass2.png Man kann hier nun im unteren Fenster sehen, welcher Code an den eigentlichen Kompiler gesendet wird. (Alle überflüssigen SPACE entfernt, ';' Remarks entfernt, Upper-Case usw...)
  21. Ja, Du hast Recht! Wieso habe ich nicht gleich dran gedacht? *andiestirnpatsch* So "zerstückel" ich nun meinen Code: for (int p = 0; p < line; p++) { compiledLine[p] = removeSpaces(compiledLine[p]); for (int i = 0; i < compiledLine[p].length(); i++) { if (compiledLine[p].charAt(i) == 0x03B) { compiledLine[p] = compiledLine[p].substring(0, compiledLine[p].indexOf(";")); break; } } } for (int p = 0; p < line; p++) { System.out.println("# " + compiledLine[p]); } (Der letzte Loop ist nur zum Test. Das muss noch gegen den eigentlichen Compiler getauscht werden) Ausgabe: # # # # # ORG &4000 # # LD DE,&1111 # LD DE,&1111 # LD DE,&1111 # LD DE,&0001 .....
  22. Hallo zusammen, Ich habe ein (kleineres) Problemchen: Ich möchte einen Compiler basteln, welcher mir zunächst in einer Schleife die einzelnen Zeilen die "remarked" Inhalte herausschneiden soll. Das Ganze soll ein Assembler werden. Das "Remark" Zeichen ist also in diesem Fall das Semikolon ; Nun versuche ich also, jede Zeile um den Text hinter diesem Semikolon herauszuschneiden. (Inkl. dem Semikolon natürlich) Mein "Versuch" scheitert leider noch: for (int p = 0; p < line; p++){ for (int i = 0; i < compiledLine[p].length(); i++){ if (compiledLine[p].charAt(i) == 0x03B){ compiledLine[p] = compiledLine[p].substring(compiledLine[p].length()-i,compiledLine[p].length()); break; } } } Was mache ich hier falsch? Beispiel: Dieses soll mein Assembler werden. Die gewünschte Ausgabe in den Compiler soll nun also wie folgt aussehen: ORG &4000 LD DE,&1111 LD DE,&1111 LD DE,&1111 LD DE,&0001
  23. Hallo, ich habe ein mittleres Problem: In einem Spielchen, welches ich gerade gestalte, kommt es zu folgendem Phänomen: Wenn ich die Seite wechsele bzw den Browser schliesse, hängt das Applet nach. Applet HTML Page Hat irgendjemand eine Idee, wie ich das ändern kann? Gruss, Markus
  24. Menno, ich will aber AUCH mal was falsch machen... (Apropos falsch machen: JavaCPC Desktop available as BETA! Mal eine BETA meines Emulators zum testen, macht hauptsächlich nur Sinn für Leute, die den CPC kennen... aber eventuell auch mal so ganz interessant) Frohe Weihnachten an Alle!
  25. Auf dem (von mir hier in Java emulierten) Homecomputer gibt es die Möglichkeit, per "Page-flipping" interlaced Grafiken darzustellen. Diese "Flackern" bei 25hz allerdings arg, und da ein heutiger Monitor keine 50hz mehr darstellen kann, verschiebt sich dann sogar im Emulator noch dieses Flackern um einige Zeilen. Durch meine Methode geht dieses Flackern auf nahezu 0 (+- ein paar seltene Male, wenn der Resync nicht 100% korrekt ist) aber man sieht dennoch beide Bilder indem das eine mit 50% Transparenz auf das zweite gezeichnet wird. Wie man hier sehen kann, flackert das GIF anfangs zwischen 2 Bildern (Was im Computer 50x pro Sekunde passiert) Aktiviere ich nun meine De-Interlace Funktion, steht das Bild stabil.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...