Newsgroup: it.comp.lang.visual-basic
Titolo: VB.NET - Come realizzare delle pseudo-union

Buongiorno a tutti.
In C esiste una struttura molto interessante che si chiama UNION: in
pratica consente di dichiarare in una struttura due variabili che
condividono lo stesso spazio di memoria; in VB6 era possibile fare
qualcosa del genere con:
	Type tagFloat
		Dim Float As Single
	End Type
 
	Type tagQuadHex
		Dim HEX0 As Byte
		Dim HEX1 As Byte
		Dim HEX2 As Byte
		Dim HEX3 As Byte
	End Type
Io lo uso per convertire quattro byte ricevuti tramite pacchetto UDP
che mi rappresentano un float... in un float!
Nel mio programma, al momento dell'utilizzo chiamerň:
        Dim QuattroByte As tagQuadHex
        Dim TheFloat As tagFloat
       QuattroByte.HEX0 = 127
       QuattroByte.HEX1 = 125
       QuattroByte.HEX2 = 123
       QuattroByte.HEX3 = 121
        LSET TheFloat = QuattroByte 
In TheFloat.Float avevo il float ricevuto rappresentato dai 4 byte.
L'operazione non era consigliata da microsoft ma funzionava. Detto per
inciso č una soluzione che ho trovato su un post precedente.
Ore in .NET non č piů possibile fare una cosa del genere, ma la mia
esigenza rimane: poter convertire quattro byte che mi rappresentano un
FLOAT in un FLOAT gestibile da VB.
Qualche suggerimento?
Francesco

 Qualche suggerimento?
A parte il fatto che potresti crearti un metodo che si occupa della 
conversione.
La cosa che mi chiedo è... se vuoi perseverare con quella soluzione
non bella ma che funzionava... perché non usi le Structure?
'Ho 38.5 di febbre... non garantisco sui post :-)
-- 
Antonio Cangiano
Webmaster di 
www.visualcsharp.it
free.it.comp.lang.csharp - free.it.comp.lang.vbnet
free.it.comp.lang.aspnet - free.it.comp.lang.delphi

 'Ho 38.5 di febbre... non garantisco sui post :-)
Mi dispiace per i tuoi 38,5° di febbre... auguri!
Per il metodo per la conversione, mi sembra alquanto macchinoso! E poi è una
cosa così stupida in linguaggi come il C e il "vecchio" VB6 che mi fa venire
il vomito il fatto di doverlo fare martello e scalpello su 
VB.NET
.
Saresti così gentile da spiegarmi come imposteresti il discorso con la
structure?
Una domanda: Su C# lavorare col protocollo UDP (e anche TCP/IP) è macchinoso
come nel vecchio VC6 oppure è possibile un approccio molto più immediato
come in VB?
Grazie di tutto e auguri ancora per il febbrone.
Francesco

Con VB.Net puoi creare delle vere Union attraverso alcuni attributi da
applicare alle strutture
Ecco un esempio di union relativo al tuo esempio
Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Explicit)> Structure myFloat
 <FieldOffset(0)> Dim Float As Single
 <FieldOffset(0)> Dim HEX0 As Byte
 <FieldOffset(1)> Dim HEX1 As Byte
 <FieldOffset(2)> Dim HEX2 As Byte
 <FieldOffset(3)> Dim HEX3 As Byte
End Structure
Dim oMyType As myFloat
oMyType.HEX0 = 0
oMyType.HEX1 = 0
oMyType.HEX2 = 0
oMyType.HEX3 = 0
Console.WriteLine("Float equivalent:{0}", oMyType.Float)
HTH
--
Corrado Cavalli [Microsoft MVP]
UGIdotNET - 
http://www.ugidotnet.org

 Grazie di tutto e auguri ancora per il febbrone.
Grazie a te.
Ciao,
Antonio
--
'Ho 38.5 di febbre... non garantisco sui post :-)


Grazie delle risposte cosě celeri e complete.
Stasera provo!
Ciao.
Francesco

 un FLOAT gestibile da VB.
Sinceramente conversioni del genere con valori in virgola mobile (i
cui byte hanno significati molto particolari) mi sembrano *molto*
pericolose, per effettuare una conversione sicura bisognerebbe
sapere alla perfezione il significato dei byte dei due formati.
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 sapere alla perfezione il significato dei byte dei due formati.
Hai ragione! Ed ecco perché preferisco NON farle con una funzione mia...
Ciao.
Francesco

 funzione mia...
Appunto. Nella maniera in cui lo fai tu non effettui nessuna
conversione, ma prendi i valori così come sono. Ma i byte dei
numeri in virgola mobile hanno un significato ben preciso.
Vedi:
http://babbage.cs.qc.edu/courses/cs341/IEEE-754.html
