Newsgroup: it.comp.lang.visual-basic
Titolo: Long & Integer

Qualcuno riesce a illuminarmi su questa cosa??
Private Sub Command1_Click()
  Dim ln As Long
  ln = 1000 * 1000
  MsgBox ln
End Sub
Va in overflow quando fa l'operazione!!!
Si risolve se si mette clng(1000)....
Non mi sembra tanto logica la faccenda...
Grazie MIk

Mik wrote:

certo che è logica!
l'intero arriva a 32000 e qualcosa e scrivendo 1000 vb lo considera
intero.
i calcoli andrebbero sempre fatti con il tipo di dato più "alto"
o fai clng o scrivi
1000& * 1000&
che poi è la stessa cosa.
ciao

 intero.
Fermo restando che cosě č, posso dire che, IMHO ^100,
questa mi pare invece un'immensa stronzata?
Perchč lo considera intero?
Perchč non ci pensa lui a considerarlo, invece, del tipo "piů alto"?

 Perchè non ci pensa lui a considerarlo, invece, del tipo "più alto"?
Lui probabilmente considera il tipo più alto definito nell'espressione,
forse perchè la logica intera è molto più veloce in quanto già gestita dal
processore,
altrimenti i=i+1 ci metterebbe un sacco!
Comunque anche IMHO dovrebbe mettere in piedi un meccanismo automatico il
vb!!!!

 Perchè non ci pensa lui a considerarlo, invece, del tipo "più alto"?
perchè un compilatore, quando trova un valore costante, opta tipicamente per
il tipo "meno ingombrante" in grado di contenerlo. Questo, di base, dovrebbe
comportare due vantaggi:
* Minor consumo di memoria
* Maggior velocità computazionale.
.A
UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org

 che poi è la stessa cosa.
Non è proprio vero :)
CLng() viene valutato a runtime, & indica al compilatore che deve 
trattarlo come Long, quindi a runtime sa già che è un long.
1000& è più corretto e più veloce.
Ciao

 Perchè non ci pensa lui a considerarlo, invece, del tipo "più alto"?
Perchè lui legge i valori dell'espressione, vede che sono tutti integer 
e dice "ah, bene, stiamo lavorando con integer, quindi il risultato sarà 
un integer", alloca lo spazio per un integer, prova a metterci il 
risultato e si accorge che non ci sta.
In effetti se ci pensi la cosa ha una logica: seguendo il tuo 
ragionamento VB dovrebbe lavorare sempre con i double (così ci sta 
dentro tutto) se non con i Decimal, con evidenti perdite in prestazioni 
e in precisione del dato.
.Net dovrebbe usare i double128 (o come si chiamano) con prestazioni e 
risorse in picchiata.
VB non può permettersi di fare 1000 * 1000, valutarlo come double, 
guardare se ci sta in un integer, se non ci sta allora prova con i long 
e così via, per poi comunque accorgersi che magari non ci sta nella 
variabile del risultato.
P.S.: nota che se io faccio
? 1000 * 1000 -> overflow (come detto sopra)
? 1000 * 1000& -> Ok (converte nel tipo più alto dell'espressione)
? 1000 * 1000* 1000& -> overflow (perchè valuta un pezzo alla volta: 
1000 * 1000)
Ciao

 risultato e si accorge che non ci sta.
La cosa non è che sia tanto logica, se la stessa cosa la scrivi in C,
Pascal, C# si comporta correttamente, sapendo che la varabile che conterrà
il risultato è un long il dato dovrebbe essere trattato come un long
altrimenti vuol dire che prima valuta
1000 * 1000 Come espressione costante di due interi
Poi il risultato lo mette in un long, solo che al primo passo da errore in
quanto il risultato non è long.
Sarebbe corretto invece valutare prima valutare = (ln che è long) poi il *
con 1000 e 1000 con il risultato long.
Cioe costruire un albero di parsing a partire dall' uguale e poi scendere
invece che partire dall' *

[*massi69* : gor...@FORZASPAMimotionline.com] ha scritto:

Ecco!

 invece che partire dall' *
Condivido....
Ma in anni e anni di studi sui compilatori perchè mai nessuno l'ha pensato??
MIk

 Ma in anni e anni di studi sui compilatori perchè mai nessuno l'ha
pensato??
Perche il Basic è sempre stato un interprete, come lo è ancora adesso.

> Perchè lui legge i valori dell'espressione, vede che sono tutti
...e sticaz**i non ce li metti??!
Ma se non ti piace VB e ti trovi bene in C perchè non lo usi????
Ossia
Se VB non è C
Perchè non Usare C al posto di VB???!!!
Oppure
pontepetippetappete!
ponte petà Perugia!
o anche
Ambarababà
C C (ossia C++)
CoCo (ossia Co++)
Ovvia!
:o)
--
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici

 :o)
Pace ! :)
mmmm guarda che non c'era nessun intento polemico, ne dire che uno č meglio
di un altro, solo dire che č differente il modo in cui il VB effettua la
valutazione dell'epressione e che in altri ambienti la valutazione della
stessa non presenta problemi.

 mmmm guarda che non c'era nessun intento polemico, ne dire che uno è
CUT
e chi lo dubita!
come sembra ti abbian detto qui e sicuramente in altri post.....dipende dal
compilatore....e come tutti i programmi...ci son varie scuole di
pensiero....oltrechè gruppi di sviluppo...
Nel caso del C (di QUEL compilatore C) hanno privilegiato alcune cose
Nel caso del VB altre.....
Secondo me l'errore se c'è....è quello di voler a tutti i costi fare
comparazioni fra cose diverse!
VB è fatto così
C è fatto cosà
Delphi è fatto colì
ognuno di questi se spulciamo son convinto HA i suoi "Long & Integer"
sbagliato (se c'è un errore) è affrontare con conoscenze da C un Vb o con
conoscenze da delphi un C
altrimenti fra un po ci lamenteremo dell'assenza dei puntatori in Vb
oppure della macchinosità di creare una form modale in C ...etc etc
Salutos
:o)

 oppure della macchinosità di creare una form modale in C ...etc etc
Con una piccola differenza pero
se io scrivo
dim a    as long
a=65537*65537
Non mi devi dare errore !!!!!!!
Sopratutto tendo conto che uno dei punti di forza del Basic e la non
tipizzazione delle variabili, altrimenti se devo mettere
dim a    as long
a=65537&*65537&
Allora diventa come il cast del C e a questo punto pero non è piu Basic.

 news:Ay5za.224291$K35.5...@news2.tin.it...
Hai fatto finta di nulla ....te lo riposto io...vediamo se lo leggi
ANDREA un po + in sù diceva....
"
perchè un compilatore, quando trova un valore costante, opta tipicamente per
il tipo "meno ingombrante" in grado di contenerlo. Questo, di base, dovrebbe
comportare due vantaggi:
* Minor consumo di memoria
* Maggior velocità computazionale.
"
dim a as long
a = 100000
non c'è verso si sbagli
a=10000*10000
si sbaglia perchè non sa questi "valori costanti" che sono...non sapendolo
lo fa con gli integer (per ragioni che sanno solo i progettisti ...forse per
via dei registri della cpu!)
basta che tu fornisca un cast a uno dei valori costanti e il compilatore si
"forza" a quello che vuoi tu!
a=1000& * 1000&
ma permettimi una annotazione...sebbene si usi ....questa è una assegnazione
che mi fa storcere il naso!
ossia se hai bisogno di valutare una operazione
Dim ris as Long
dim a as long
dim b as long
input validazione a
input validazione b
ris=a * b
questo mi piace assai di più!
...per fare quello che vuoi far tu
SHELL (Calcolatrice.exe)...non è + semplice?...ad ognuno il suo mestiere!la
calcolatrice...serve a calcolare!
:-)


 a=1000& * 1000&
La nota non riguardava il perche fa cosi ma il fatto che ho confrontato come
funziona in C o in altri linguaggi, se il VB ci obbliga a specificiare il
formato
per compiere l'operazione corretta ci obbliga a ragionare come si fa in C,
controllando quindi i tipi, ma poi ragiona in Basic nel momento stesso in
cui
esegue l'operazione quindi è giusto ragionare in Basic o in altro modo ?
NB
Pura mera disquisizione filosofica e null'altro.
Meglio un bel vodkino e un po di spuntini :)))
MAX

 MAX
beh se la butti in filosofia.....
mi spieghi anche in c che bisogno c'è di fare
A=1000*1000
invece di
A=1.000.000
Nota una cosa il VB ti permette di non specificare nulla
io metto sempre un bel
Option Explicit
I Variant cerco di usarli il meno possibile (usati qualche volta per le
date)
etc etc
Che vuol dire?...vuol dire che ci sono alcune regole anzi no delli Standard
(ma rende poco l'idea) USI
ecco USI
La gente normale (o almeno la gente come me)
usa queste cose
I fuoriclasse altri USI
Ad esempio....per guidare ci vuole la patente
Tutti noi accettiamo questo uso
...poi abbiamo l'uso di macchine "facili" da guidare
...al punto che se montiamo su una F1 nenache riusciamo a partire....eppure
è pur sempre un motore a scoppio!
Un fuoriclasse può permettersi sgarulli con una macchina normale perchè sa i
suoi limiti ed i limiti del mezzo che ha sotto le chiappe!
E sa dominare (ragionevolmente) gli imprevisti!
Se rinunci ad option explicit
se accetti i variant
se fai 1000*1000
devi essere un fuoriclasse e saper gestire le "sbandate" controllate
altrimenti scrivi l'esempio che facevi come:
Private Sub Command1_Click()
Const a As Long = 1000
Const b As Long = 1000
Dim rs As Long
rs = a * b
MsgBox CStr(rs)
End Sub
e con questo tranquillo diesel con airbag e abs viaggi tranquillo per la tua
strada!
Saluti!
;-)
p.s.
Mi sa che devo cambiare nick...cominciate a starmi sulle palle appena non vi
torna che dico, con questi wodkini e ciucchini!
ma pensate alla salute !
:-)ROTFL
