Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    218

    errore: "Invalid left-end side ezpression in postfix operation at grafico_ep"

    Con il codice riportato qui sotto ottengo il grafico delle equazioni parametriche:
    {x=f(z) , f=g(z) con il parametro z che varia nell’intervallo [ei, es].
    Se l’intervallo contiene solo numeri positivi, per es. [0, 4], il codice dà il grafico, ma se l’intervallo contiene anche numeri negativi il codice si blocca e dà l’errore:
    “Invalid left-end side expression in postfix operation at grafico_ep”
    Come far accettare al codice anche i numeri negativi che appartengono all’intervallo di esistenza [ei, es]? Grazie

    lanvoel

    codice:
    var ei=1
    var es=1;
    function grafico_ep()
    {
    ei=esi.value*1;
    es=ess.value*1;
    var espreg=/z/g;
    x1=testo_x.value;
    y1=testo_y.value;
    colore_funzione=colore_f.value
    x2=0;
    y2=0;
       for (i=ei; i<=es; i=i+0.01)
       {
        numericax=x1.replace(espreg,i);
          x=eval(numericax)
    
    
        numericay=y1.replace(espreg,i);
        y=eval(numericay)
      ctx.strokeStyle=colore_funzione;
      ctx.lineWidth=spessore_linea;  
    ctx.beginPath();
         ctx.moveTo(x*u,-y*u);  
         ctx.lineTo(x2*u+0.01,-y2*u-0.01);
    ctx.closePath();
    ctx.stroke();
    x2=x;
    y2=y;
       }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    218
    Ho trovato come risolvere il mio problema, anche se non ho capito bene il perché.
    Ogni volta che, nelle formule delle equazioni parametriche, il parametro è preceduto da un segno meno, il parametro stesso deve essere scritto tra parentesi tonde.
    es. le equazioni parametriche, nel parametro z, di una cubica:
    { x=5*(1-z*z)*(1+z*z)
    y=5*z*(1-z*z)*(1+z*z)
    per essere lette dal codice ed eseguire il grafico, senza bloccarsi per errore, devono essere scritte così:
    { x=5*(1-(z)*z)*(1+z*z)
    y=5*z*(1-(z)*z)*(1+z*z)
    Se possibile, desidererei sapere il significato del SyntaxError:ep
    Uncaught SyntaxError: Invalid left-hand side expression in postfix operation at grafico_ep

    lanvoel

  3. #3
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Il problema sta tutto in quell'eval che evidentemente è usato in modo superficiale, cioè senza aver convalidato adeguatamente la stringa (con i relativi dati) datagli in pasto, e valutato tutti gli eventuali effetti collaterali che potrebbero provocare dei dati non conformi.

    Mi pare doveroso aprire una parentesi.
    Si noti che nella documentazione stessa di questa funzione è riportata questa avvertenza:

    Warning: Executing JavaScript from a string is an enormous security risk. It is far too easy for a bad actor to run arbitrary code when you use eval(). See Never use eval()!, below.
    fonte: https://developer.mozilla.org/en-US/...l_Objects/eval

    e, a seguire, tutti i punti per cui viene indicato di non usare mai eval():
    https://developer.mozilla.org/en-US/...never_use_eval!

    Tant'è che, proprio a motivo di questo, nel gergo JavaScript si usa spesso dire "eval is evil!".

    Ora, io personalmente non sono contrario nell'usarlo, ma concordo pienamente col fatto che va usato col massimo rigore.

    In questo caso il tuo eval sta "valutando" una stringa in cui è possibile inserire presumibilmente qualsiasi cosa. Questa sarà quindi eseguita esattamente come fosse un normale script.

    Non vedo controlli sulle equazioni definibili da input utente, ne tanto mento su quel valore che va a sostituire il parametro "z".
    Non vedo dei controlli precisi per scartare o convalidare eventuali dati non conformi, anche a prescindere da quel valore "z" positivo o negativo che sia.

    Se si vuole usare eval suggerisco di prendere in considerazione il fatto di inserire opportune verifiche di tutti gli input utente e dei valori usati per costruire le stringhe passate a tale funzione.
    Chiudo la parentesi.

    Detto questo, dove sta la causa di quel messaggio di errore? E' presto detto.
    Prendiamo una tua stringa d'esempio, che rappresenta l'equazione:
    codice:
    5*(1-z*z)*(1+z*z)
    qui viene sostituita (con replace) ogni "z" in modo testuale. Anche se il valore di "z" è numerico, ricordati che il replace agisce sulla stringa testuale, la quale dovrà essere data in pasto allo stesso eval.

    Cosa succede quindi se il valore è un semplice numero positivo?
    Mettiamo che z sia 10, quindi il replace fornisce questa stringa come risultato:
    codice:
    5*(1-10*10)*(1+10*10)
    passandolo ad eval (che lo valuta e lo esegue come script) non ci sono errori perché questo script è sintatticamente giusto. Ne sarà quindi valutato il risultato matematico in modo corretto.
    Se infatti esegui questa espressione come script, otterrai certamente un valore numerico.

    Mettiamo invece che z sia -10, cioè un valore col segno meno davanti.
    Cosa pensi che succeda quando avviene il replace?
    Ogni "z" viene sostituita con la stringa "-10" per cui si ottiene questa stringa:
    codice:
    5*(1--10*-10)*(1+-10*-10)
    Questa stringa è di per sé un regolare testo (se preso appunto come semplice testo) ma quando la si da in pasto ad eval, dovrà essere valutata come script.

    A questo punto puoi ben vedere che quel meno, davanti al 10, crea presumibilmente qualche conflitto con i segni già presenti in tale espressione, generando quindi dei possibili errori di sintassi a livello di esecuzione dello script.

    In particolare il "--" rappresenta un operatore di decremento che, in questo caso, viene applicato al valore 1 secondo quella che viene detta "operazione suffissa" (cioè l'operatore è posto a seguire l'operando).

    Il problema è che l'operatore di decremento non può essere applicato ad un valore fisso, perché questo valore di per sé non può variare; lo si può applicare piuttosto a delle variabili.

    A questo punto l'interprete JavaScript ti dice "Espressione del lato sinistro non valida nell'operazione suffissa".

    In altri browser questo stesso errore viene riportato con il messaggio "invalid increment/decrement operand", in cui sono usati termini forse più comprensibili rispetto a "Invalid left-hand side expression in postfix operation" ma che in sostanza indicano la stessa cosa.

    Il fatto che tu abbia poi racchiuso quel parametro tra parentesi, rende invece l'espressione valida da un punto di vista sintattico, per cui si avrà ad esempio:
    codice:
    5*(1-(-10)*-10)*(1+-10*-10)
    Puoi notare che i due segni meno non vanno più a rappresentare un operatore di decremento, perché interrotti dalla parentesi, e quindi quei valori negativi sono risolti in modo regolare.

    A dirla tutta, sarebbe bastato anche un semplice spazio tra quei due meno "- -", per cui la stessa espressione potrebbe essere scritta così:
    codice:
    5*(1- z*z)*(1+z*z)
    che col replace darebbe, ad esempio, questo risultato:
    codice:
    5*(1- -10*-10)*(1+-10*-10)
    Anche qui i due segni meno sono risolti singolarmente, per cui non si avrà quell'errore.

    Perdona la lungaggine ma penso che in questo caso era necessario affrontare i diversi punti in modo pittosto approfondito per poter comprendere meglio l'argomento.
    Spero sia tutto chiaro.

    Buon proseguimento
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    218
    Grazie KillerWorm, anche per quelle che tu hai chiamato "lungaggini" che sono invece molto utili e chiarificatrici

    lanvoel

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.