Domanda Flash Actionscript 3 Bug? Utilizzando un numero int e negativo in un interruttore / caso


Esecuzione di questo codice

var myValue1:int = 2;
switch (myValue1)
{
    case -3: trace(myValue1 + " == -3"); break;
    case -2: trace(myValue1 + " == -2"); break;
    case -1: trace(myValue1 + " == -1"); break;
    case 0:  trace(myValue1 + " == 0"); break;
    case 1:  trace(myValue1 + " == 1"); break;
    case 2:  trace(myValue1 + " == 2"); break;
    case 3:  trace(myValue1 + " == 3"); break;
    default: trace(myValue1 + " is unknown"); break;
}

var myValue2:int = -2;
switch (myValue2)
{
    case -3: trace(myValue2 + " == -3"); break;
    case -2: trace(myValue2 + " == -2"); break;
    case -1: trace(myValue2 + " == -1"); break;
    case 0:  trace(myValue2 + " == 0"); break;
    case 1:  trace(myValue2 + " == 1"); break;
    case 2:  trace(myValue2 + " == 2"); break;
    case 3:  trace(myValue2 + " == 3"); break;
    default: trace(myValue2 + " is unknown"); break;
}

dà questo risultato:

2 == 0
-2 è sconosciuto

(Compilato in Flash Builder 4.7.0.349722, in esecuzione su Flash 11.5.502.149. Esecuzione in Windows 7 SP1, Firefox 18.0.2)

Le seguenti modifiche risolvono tutti il ​​problema precedente, fornendo l'output corretto:

  • Modifica del tipo di valore in Number.
  • Rimozione del numero negativo case dichiarazioni.
  • Cambiare il case dichiarazioni da usare int-variabili piuttosto che letterali... a meno che anche queste variabili non siano const, nel qual caso rimane rotto!

Mutevole myValue2 = -1 dà l'output -1 == -3, che è ugualmente wtf-ish.


Chiaramente questo è un bug, ma ... cosa lo causa? C'è qualche sfumatura di utilizzo int  o numeri negativi in ​​case-statement che non capisco? Il mio codice è in qualche modo sbagliato? O si tratta semplicemente di un problema con il compilatore bytecode in Flash Builder?


19
2018-02-07 22:36


origine


risposte:


Non penso che troverai una risposta concreta a questa domanda. Quello che posso offrire è una conferma del bugginess del compilatore AS3. Ho passato un po 'di tempo a cercare di risolvere simili errori "magici" e sono venuto fuori vuoto. Uno di questi esempi è un ciclo For e While che salta il primo o l'ultimo elemento in una matrice senza alcun motivo apparente mentre un ciclo Foreach ha funzionato bene.

Per me il motivo più plausibile è un errore nella gestione della memoria. Potrebbe anche essere legato all'hardware poiché la frequenza di tali eventi è stata maggiore su alcune macchine su cui io o i miei colleghi abbiamo lavorato. Quello che penso è che alcune condizioni 'invisibili' siano soddisfatte per es. ordine delle operazioni eseguite (si potrebbe provare a inserire un codice fittizio tra la dichiarazione var e lo switch o magari assegnare il valore var più volte, solo per "fare jog sulla memoria") che combinato con il compilatore soggetto a errori rovina la memoria l'indirizzamento e il tuo switch pensano di compendersi con due numeri interi, mentre in realtà ha un valore diverso dalla memoria.


1
2018-02-13 14:22



Probabilmente è possibile forzare la mano del compilatore convertendo il valore originale in una stringa e trasformando i casi in valori stringa.

switch( String(value) )
{
   case "-3": /*do something*/; break;
   case "-2": /*do something*/; break;
   case "-1": /*do something*/; break;
   case  "0": /*do something*/; break;
   case  "1": /*do something*/; break;
   case  "2": /*do something*/; break;
   case  "3": /*do something*/; break;
   default: break;
}

1
2018-02-14 22:25



Questo è semplicemente un problema con il compilatore bytecode in Flash Builder.

Chiaramente, la tua sintassi va bene; ci sono letteralmente centinaia di problemi noti con il compilatore risalenti al 2005 che sono ancora aperti o non risolti.


1
2018-02-17 21:52