Newsgroup: it.comp.lang.visual-basic
Titolo: non mi riconosce la variabile di tipo long

Salve a tutti
domanda probabilmente banale
dichiaro una variabile di tipo long e cmq se supera i 32 mila e rotti mi
sbatte fuori sub senza dichiararmi nessun tipo di errore
dove sbaglio?
grazie
vb5
dim p_tempo as long
Do While Not EOF(a)
 Line Input #a, rec
  If (InStr(rec, stringa) > 0 And flag = 0) Then
    flag = 1
    Print #b, rec
    ora = Left(rec, 2)
    min = Mid(rec, 4, 2)
    sec = Mid(rec, 7, 2)
    ore = Val(ora)
    minuti = Val(min)
    secondi = Val(sec)
    p_tempo = (ore * 3600) + (minuti * 60) + secondi

 dove sbaglio?
probabilmente, nel gestire l'errore nella routine chiamante.
come sono dimensionati ora, min e sec ?
sei sicuro che occorra tutto quel codice? cosa cerchi di calcolare?
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo


Devo calcolarmi il tempo di montaggio di un prodotto
La macchina mi da un file con inizio e fine
esempio
08:12:23 inizio
08:17:45 fine
sta il fatto che la variabile in oggetto non supera i 32 mila e rotti anche
se dichiarata long

 ha scritto nel messaggio
news:c34k33$jd5$1...@e3k.asi.ansaldo.it...

dimenticavo ora min e sec sono integer

 dimenticavo ora min e sec sono integer
A me sembrano string.
Apri con notepad e posta qui una (piccola) parte del contenuto.
termoPilucco

 dove sbaglio?
Essendo ore, minuti e secondi Integer ed essendo valutati come integer anche
3600 e 60, VB tenta di memorizzare il risultato dell'espressione a destra
dell'uguale in un Integer. Usa CLng(num) per forzare la valutazione
dell'espressione come Long. Dovrebbe bastare forzare "uno solo" dei
fattore/addendi affinche' tutta l'espressone venga valutata come Long. Non ho
voglia di provare :) Sicuramente la seguente funziona comunque =)
p_tempo = (CLng(ore) * CLng(3600)) + (CLng(minuti) * CLng(60)) + CLng(secondi)
Puoi senz'altro eliminare qualche Clng :P
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
Statuto: 
http://www.it-lang-vb.net/docs/Statuto.txt
UGIdotNET - 
http://www.ugidotnet.org

 dimenticavo ora min e sec sono integer
Quanto fa (20 * 3600)?

     p_tempo = (ore * 3600) + (minuti * 60) + secondi
p_tempo = (ore * 3600.0) + (minuti * 60.0) + secondi
Va meglio?
Ciao
Alberto
PS: mi auguro che ora, min e sec siano string, altrimenti mi ribalto sulla
seggiola...

 sulla seggiola...
Se non manca un "non", mi ribalto io... :-(


?
Leggo:
    ora = Left(rec, 2)
    min = Mid(rec, 4, 2)
    sec = Mid(rec, 7, 2)
da cui la mia osservazione.
Poi leggo:
ora min e sec sono integer
da cui l'errore.
Ciao
Alberto

 da cui l'errore.
Capisco (non avevo visto come ricavava ora min sec)...
L'errore č un probabile overflow per quel ore*3600.
Se cosě č, diciamo che il conto lo fa e che quindi VB ci mette molto del
suo, in fatto di conversioni...
piů di quanto io (persino io) possa concepire.

[Lupo = 
circa_LupoOrm...@libero.it
 in
c34prk$24ee1a$
1...@ID-174464.news.uni-berlin.de
] ha scritto:
Ho riletto tutto. Se quello è tutto il codice, allora:
    ora = Left(rec, 2)
    min = Mid(rec, 4, 2)
    sec = Mid(rec, 7, 2)
sono Variant (String) non dimensionati, poi usati per assegnare gli Integer
con le Val qui sotto:
    ore = Val(ora)
    minuti = Val(min)
    secondi = Val(sec)
Poi qui, in funzione dei valori, si può verificare l'overflow:


     p_tempo = (ore * 3600) + (minuti * 60) + secondi
Il problema l'ha spiegato piuttosto bene Lokar.
Il mio consiglio è quello di dimenticare gli integer e usare solo long,
tanto VB in memoria lavora sempre a DWORD, fruttando la tecnologia a 32bit,
quindi non ci sono risparmi in questi termini (e comunque voler risparmiare
2 byte in un programma che probabilmente fa aqua da tutte le parti... ;P )
Inoltre proprio perchè i long sono il tipo di dato "naturale" in ambienti
32bit risultano anche più performanti, anche se di pochissimo.
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 08:17:45 fine
a parte le risposte corrette che ti hanno dato gli altri, non puoi usare una
qualche funzione che calcola direttamente la differenza tra i due orari,
nell'unità di misura che preferisci, invece di trasformare tutti gli orari
in secondi?


Ho risolto dichiarando long anche ora min e sec
In pratica da quello che ho capito un prodotto di un integer per un numero
non puņ dare un long
E' possibile ?

 ha scritto nel messaggio
news:c36chv$210qu0$1...@ID-173193.news.uni-berlin.de...


 tu cosa suggerisci?
a parte studiare un testo sul quoting? :-)
mi riferivo a questa:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbenlr98/html/vafctdatediff.asp
