Newsgroup: it.comp.lang.visual-basic
Titolo: Integer e overflow

Salve a tutti,
Ecco il mio problema:
Ho una variabile ("dichiarata" come Long) di nome
Secondi, in cui faccio il calcolo dei secondi contenuti
in 9 ore, 6 minuti e 8 secondi, che, calcolato a mano,
fa precisamente 32.768 ovvero 1 in più del limite di
overflow delle variabili integer.
Scrivo un po' di codice, che magari risualta + chiaro:
Dim Secondi As Long
---------------------------------------------------------------
Private Sub Form_Load()
Secondi = (9 * 3600) + (6 * 60) + 8 'che fa 32.768
End Sub
---------------------------------------------------------------
Questa procedura sarebbe estremamente semplice se
il caro VB non facesse come vuole, ignorando il mio
"As Long" e "sostituendolo" con un "As Integer".
Praticamente mi da errore di overflow non appena
eseguo l'applicazione, cosa che con un long (con limite
di + di 3 miliardi) non dovrebbe accadere, mentre
con un integer è giusto e normale. Ho già provato
a dichiarare Secondi anche come Single, Double,
Variant e tutto ciò che è più grande di un Integer,
ma VB sembra fregarsene e continua comunque a
darmi l'overflow...
Come mi devo comportare?
Grazie mille a chi mi risponderà
--------------------------------------------
             ASSA
http://web.tiscalinet.it/Assatarram
Napster: Assatarram3
it.comp.lang.visual-basic: Assatarram
--------------------------------------------

 ---------------------------------------------------------------
Il buon VB usa Integer per default e poi lo trasforma in long.
Quindi:
Secondi = CLng(9 * 3600) + CLng(6 * 60) + 8 'che fa 32.768
Prova tu che io non ho VB sotto mano........
Ciao
Sirjo

 di + di 3 miliardi)
Darei anche una rinfrescata alle nozioni sui valori massimi
attribuibili ai tipi.

 eseguo l'applicazione, cosa che con un long (con limite


 Praticamente mi da errore di overflow non appena eseguo l'applicazione,
cosa che con un long (con limite di + di 3 miliardi) non dovrebbe accadere,
mentre con un integer è giusto e normale. Ho già provatoa dichiarare Secondi
anche come Single, Double, Variant e tutto ciò che è più grande di un
Integer, ma VB sembra fregarsene e continua comunque a darmi l'overflow...
Il problema non dipende da come dichiari la variabile che conterra` il
risultato dell'espressione ma dall'espressione stessa che, essendo basata su
valori che rientrano tutti nell'intervallo di un Integer ( 9; 3600; 6; 60;
8 ) viene valutata come Integer:
    9 * 3600 = 32400 (Integer)
    6 * 60 = 360 (Integer)
    32400 + 360 = 32760 (Integer)
    32760 + 8 = Overflow
E` sufficiente che almeno uno dei valori dell'espressione sia di tipo Long
perche' il problema non si presenti:
    Secondi = CLng(9) * 3600 + 6 * 60 + 8
o, indifferentemente:
    Secondi = 9 * 3600 + 6 * 60 + CLng(8)
Si puo` anche usare il carattere qualificatore del tipo Long (&) invece
della funzione di conversione di tipo (CLng):
    Secondi = 9 * 3600 + 6 * 60 + 8&
Considera i due casi seguenti:
 1.
    Dim a%, b%, c%, d%, e% ' Tutti Integer
    Dim Secondi&           ' Long
    a = 9
    b = 3600
    c = 6
    d = 60
    e = 8
    Secondi = a * b + c * d + e       ' Overflow!
    Secondi = a * b + c * d + CLng(e) ' Ok
 2.
    Dim a, b, c, d, e
    Dim Secondi       ' Tutti Variant
    a = 9
    b = 3600
    c = 6
    d = 60
    e = 8
    Secondi = a * b + c * d + e ' Ok
Consulta anche la guida alla voce "Overflow".
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------




 ha scritto nel messaggio
news:901ic6$67n1p$4...@ID-52090.news.dfncis.de...


 Grazie mille a chi mi risponderà
