Zum Inhalt springen

Devilmarkus

Mitglieder
  • Gesamte Inhalte

    158
  • Benutzer seit

  • Letzter Besuch

Beiträge 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. Und du glaubst dir kann geholfen werden, wenn du nichtmal verrätst aus was für einem Framework diese Player Klasse kommt?

    Deine erste Aufgabe sollte daher sein: Das hier lesen.

    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 B);

    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. Wenn Du einen Parser schreibst, der einen mathematischen Ausdruck verarbeitet, dann solltest Du auch validieren können, ob das Ergebnis richtig ist.

    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. Das ist mir durchaus bewusst ich wollte mit dem Satz den TE nur behilflich sein die Intention meiner Auflistung leichter zu verstehen und dementsprechend die Stelle des Fehlers im Quellcode leichter zu finden ;)

    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.

    Was ist mit ^0.5 ? bzw auch transzendeten Zahlen aus R z.B. ^-Pi

    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. Ist ja an sich eine feine Sache...

    Mir ist aufgefallen, dass

    2^(3+1)*2 = Err,

    2^(3+1)+2 = 18

    2^(3+1)-2 = 14

    2^(3+1)/2 = 8

    2^2*2 = Err

    es scheint so als wäre da einProblem mit dem *-Operator nach einem Exponenten

    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. dann sind wir schonmal nen Schritt weiter. Nun zu deinen Ergebnissen von oben:

    ....

    hab jetzt nicht die möglichkeit gehabt, mir deinen code genau anzuschauen. aber es sieht stark nach einem falschen evaluierung der zeichen bzw der reihenfolge aus

    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)

    maxam.png

    Bild: Original Maxam-Assembler mit derselben Berechnung

  9. bin jetzt nicht so in dem Themengebiet deines Projektes drin, aber ist es nicht sehr unschön, mit fixen Werten Umrechungen durchzuführen? ich gehe jetzt einfach mal davon aus, dass dein ergebnis eine geringe Abweichung gegenüber meinem hat, weil deine hard-codierte Zahl nicht so genau ist wie die, die mein windows calc benutzt

    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)))) + ")");
    
                        }
    
                    }
    
                }

  10. Nimm doch mal nen Taschenrechner und reche es selbst nach, wenn ich mich nicht vertippt habe, müsste dort ~1,34035788489 heraus kommen.

    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.

  11. Der Ansatz hier ist die Polnische Notation ? Wikipedia Die Gleichung wird als Baum dargestellt und zur Berechnung einfach nur traversiert, wobei an jedem Knoten die Berechnung stattfindet und in den Blättern die Werte stehen.

    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*

  12. 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:

    The result of your equation (10+20-4) should be: 26 is: 26

    The result of your equation (20-10+4) should be: 14 is: 6

    The result of your equation (20-2+4*4) should be: 34 is: 2

    The result of your equation (3^13) should be: 1594323 is: 1594323

    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.

  13. Eine andere Frage beim ausführer bekomm ich lauter errors wo dahinter steht (unkown Source).

    Und einen Exception in thread "main" java.lang.StackOverflowError fehler.

    Woran liegt das? (Ist eine gui mit Borderlayout etc)

    Kann es sein, dass Du Deine Routine bis zum Erbrechen immer wieder aufrufst?

    public void doThis(){

    doThis;

    }

    :upps

  14. 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...)

  15. 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 
    
    .....

  16. 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: disass.png 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                
    
    

  17. Um mich da auch mal einzumischen,

    das war schon das richtige Forum, und jeder der hier mehr als einmal im Jahr reinschaut der dürfte deine Threads ja auch mittlerweile kennen und weiß worum es geht.

    War also meiner Meinung nach nichts falsch gemacht.

    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!

  18. 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.

    deinterlace.gif

    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...