Newsgroup: it.comp.lang.visual-basic
Titolo: OT Richiesta di aiuto su algoritmo

Scusate se sono OT, ma ho bisogno del vostro aiuto per risolvere un
problema, dato che sono un po' arrugginito.
Il problema non concerne visualbasic, ma la necessità di trovare un
algoritmo per ottenere su un microcontrollore il valore decimale di una long
distribuita su un buffer di byte
Mi spiego meglio.
1) il microcontrollore supporta solo word
2) il numero è dato dalla composizione di due word, parte alta e parte bassa
Esempio:
Word.High = 8100H
Word.Low =D3E5H
Non esiste il tipo dati long, ma per me quei due valori fanno parte dello
numero che è 8100D3E5H    cioè 
2164315109
 decimale.
Ho bisogno di estrarre le singole cifre decimali corrispondenti a quel
valore e metterle su byte diversi
B[9]=2  B[8]=1  B[7]=6  B[6]=4  B[5]=3  B[4]=1  B[3]=5  B[2]=1  B[1]=0
B[0]=9
Se fosse possibile gestire una long mi sarebbe sufficiente prendere il resto
di una successione di divisioni per 10
Ma la long non ce l'ho, ho il numero diviso su due word non collegate tra
loro.
Conoscete qualche sistema?
E' una bella sfida, lo so, ma se qualcuno avesse voglia di perdere un po' di
tempo....
Grazie
ALberto

di una successione di divisioni per 10
Allora, se a te - come sembra -  serve un long unsigned, in VB non esiste, per
cui  - in generale - devi usare un tipo superiore al long (perdendo in
prestazioni):
Dim cc As Currency
cc = CCur(word.low) + 65536 * CCur(word.high)
Da qui procedi con le divisioni per 10...
termoPilucco

 distribuita su un buffer di byte
Ricordi di gioventù con lo Z80...
Cerco di spiegarlo senza farla troppo lunga, ma se non è chiaro
chiedi.
Metodo delle sottrazioni successive, va' bene per qualsiasi dimensione
del numero binario.
Esempio per il caso di numero binario a 4 bytes.
Sottrai dal tuo numero il valore 1000000000 (ossia 0x3B9ACA00) più
volte while il risultato rimane maggiore di zero. Il numero di
sottrazioni che sei riuscito a fare è la prima cifra decimale del tuo
numero.
Riprendi il risultato dell'ultima sottrazione maggiore di zero e
sottrai il valore 100000000 (ossia 0x5F5E100) più volte while il
risultato rimane maggiore di zero. Il numero di sottrazioni che sei
riuscito a fare è la seconda cifra decimale del tuo numero.
Ripeti, e quando arrivi a dover sottrarre 1 hai già trovato anche la
decima e ultima cifra decimale del tuo numero.
Siccome ti serve il risultato dell'ultima sottrazione che non è andata
sottozero, prima di sottrarre devi fare una comparazione multibyte, e
sottrarre solo se la comparazione è maggiore di zero. Se la
comparazione è uguale a zero le cifre decimali successive sono tutte
zero e quindi puoi interrompere l'esecuzione.
Ciao.
lucky

 distribuita su un buffer di byte
Ricordi di gioventù con lo Z80...


>Metodo delle sottrazioni successive, va' bene per qualsiasi dimensione del
numero binario.
Posso provarci, ma devo rispolverare una gestione dei flag di status, perché
le sottrazioni sulla word "Alta" sono vincolate alla variazione del flag di
della word "bassa" quando la sottrazione darà un valore negativo.
Bel casino per uno che non usa assembly da 20 anni
Alberto

Spiacente, avevo detto che non riguardava visualbasic. In quel caso lo
sapevo risolvere anche io.
Ma forse il suggerimento di Lucky mi ha fatto pensare ad una soluzione....
Grazie

 un valore negativo.
Dovresti usare una istruzione di sottrazione con carry.
Conosco poco l'assembly del pic per darti indicazioni più precise.
Ciao.
lucky