SA0130: Conversioni espandibili implicite
Rileva le posizioni del codice in cui le conversioni da tipi di dati più piccoli a quelli più grandi vengono eseguite implicitamente durante le operazioni aritmetiche
Giustificazione: Il compilatore consente qualsiasi assegnazione di tipi diversi se l'intervallo di valori del tipo sorgente è completamente contenuto nell'intervallo di valori del tipo di destinazione. Tuttavia, il compilatore creerà una conversione nel codice il più tardi possibile. Per un incarico di tipo lint := dint * dint, il compilatore esegue la conversione implicita solo dopo la moltiplicazione:
lint := TO_LINT(dint * dint);
Un overflow viene quindi troncato. Se vuoi evitarlo, puoi già convertire gli elementi:
lint := TO_LINT(dint) * TO_LINT(dint);
Pertanto, potrebbe essere utile segnalare le posizioni in cui il compilatore implementa le conversioni implicite per verificare se queste sono esattamente ciò che si intende. Inoltre, è possibile utilizzare conversioni esplicite per migliorare la portabilità su altri sistemi quando tali sistemi dispongono di controlli di tipo più restrittivi.
Importanza: bassa
PROGRAM PLC_PRG
VAR
d : DINT;
l : LINT;
ui : UINT;
uli : ULINT;
usi : USINT;
lw : LWORD;
udi : UDINT;
lr : LREAL;
b : BYTE;
END_VAR
(*The following lines could result in unwanted truncating by implicit conversions and should be reported with SA0130*) l := d * d; uli := usi * usi; lw := udi * udi; lr := b * b; d := ui * ui;
Uscita in Messages vista:
SA0130: Conversione espandibile implicita dal tipo 'DINT' al tipo 'LINT'
SA0130: Conversione espandibile implicita dal tipo 'USINT' al tipo 'ULINT'
SA0130: Conversione espandibile implicita dal tipo 'UDINT' al tipo 'LWORD'
SA0130: Conversione espandibile implicita dal tipo 'USINT' al tipo 'LREAL'
SA0130: Conversione espandibile implicita dal tipo 'UINT' al tipo 'DINT'