Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    OutOfMemoryError in parser per espressioni matematiche

    Ciao a tutti,mi sto cimentando in un metodo che data un'espressione mi restituisce il risultato.
    Però se io gli passo "(2*3)^2" funzione...mentre se gli passo"(2*(3*2))^2" mi da l'errore "java.lang.OutOfMemoryError: Java heap space".Ho provato a cambiare la memoria della JVM,ma niente da fare.Il codice,salvo errori che non ho trovato sembra apposto,quindi non so come andare avanti.
    Sapete dirmi qualcosa?

  2. #2
    Quote Originariamente inviata da programmer95 Visualizza il messaggio
    Ciao a tutti,mi sto cimentando in un metodo che data un'espressione mi restituisce il risultato.
    Però se io gli passo "(2*3)^2" funzione...mentre se gli passo"(2*(3*2))^2" mi da l'errore "java.lang.OutOfMemoryError: Java heap space".Ho provato a cambiare la memoria della JVM,ma niente da fare.Il codice,salvo errori che non ho trovato sembra apposto,quindi non so come andare avanti.
    Sapete dirmi qualcosa?
    Ciao

    piccola domanda... vuoi elevare a potenza?
    Perché allora devi usare Math.pow(double, double).

    Ciao

    Eugenio

  3. #3
    Sisi,ma i calcoli sono già sistemati...il problema è il "java.lang.OutOfMemoryError: Java heap space".

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Finché non farai vedere il codice è impossibile dirti perché il programma ti va in out of memory...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    non so se ci capite...
    codice:
    //Scorro l'espressione
    for(int i=0; i<espressione.length(); i++)
    {
    
        if(espressione.charAt(i)=='^')
        {
            pos=i;
            if(contaApici==0)
            {
                contaApici++;
    
                while(pos!=0)
                {
                    pos--;
                    if(espressione.charAt(pos)=='(')
                        contaAperta++;
                    if(espressione.charAt(pos)==')')
                        contaChiusa++;
                }
                //se siamo dentro una parentesi
                if(contaChiusa!=contaAperta)
                {
                    contaApici=0;
                    contaAperta=-1;
                    contaChiusa=-1;
                    potenza--;
                    //non lo siamo
                }
                else
                {
                    contaAperta=1;
                    contaChiusa=1;
                }
                pos=i;
                if(contaChiusa==contaAperta && contaAperta!=-1)
                {
                    contaAperta=0;
                    contaChiusa=0;
                    //se il 1° operando è fra parentesi applico la ricorsione
                    if(espressione.charAt(i-1)==')')
                    {
                        pos--;
                        //while(espressione.charAt(pos)!='(')
                        while(contaAperta!=1)
                        {
                            pos--;
                            if(espressione.charAt(pos)=='(')
                                contaAperta++;
                            if(espressione.charAt(pos)==')')
                                contaAperta--;
    
                        }
    
    
                        contaChiusa=0;
                        contaAperta=0;
                        for(int j=pos+1; j<i-1; j++)
                        {
                            app+=espressione.charAt(j);
                        }
                        //Se io ho (2^2)^2 dovrebbe stampare 2^2 e lo fa...il programma funziona correttamente
                        //Se invece ho (3^(2^2))^2 dovrebbe stampare 3^(2^2) e lo fa,ma non capisco perchè poi non va
                        System.out.println(app);
                        eliminata+="("+app+")^";
                        n1=valuta(app);
                        app="";
                        pos=i;
    
                    }
    Ultima modifica di MItaly; 22-12-2013 a 23:33

  6. #6
    Prova a fare delle prove con un debugger.
    Sicuramente la doppia parentesi in qualche modo gli da fastidio e rimane appeso in qualche while mentre aggiunge parentesi o quant'altro fino a quando arriva ad un OutOfMemory.

    Inoltre
    n1=valuta(app);
    cosa fà questo metodo?
    Ultima modifica di schumy2000; 23-12-2013 a 18:26
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  7. #7
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    posta il codice completo, manca l'inizializzazione delle variabili e la dichiarazione del metodo, che presumo sia valuta. In ogni caso con ogni probabilità è la chiamata ricorsiva ad andare in out of memory, perché finisce nel caso ricorsivo infinite volte.

    Ti suggerisco inoltre di usare StringBuilder al posto di String per fare queste cose, e di stare attento ai riferimenti degli oggetti che passi fra i vari metodi.

  8. #8
    Quote Originariamente inviata da kuarl Visualizza il messaggio
    posta il codice completo, manca l'inizializzazione delle variabili e la dichiarazione del metodo, che presumo sia valuta. In ogni caso con ogni probabilità è la chiamata ricorsiva ad andare in out of memory, perché finisce nel caso ricorsivo infinite volte.
    Cerca con un motore di ricerca MemoryConsumer.java ... ti usciranno listati molto interessanti...

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.