Newsgroup: it.comp.lang.delphi
Titolo: analogo delphi dell'unsigned short in c++

stò trasformando in delphi una libreria scritta in c++, che serve per
comunicare con una macchinetta per la misurazione automatica della
pressione.
le funzioni implementate definiscono le strutture ritornate dalla
macchinetta in base all'interrogazione effettuata, es:
typedef struct VS_STATUS{
  Int16 version;
  Int16 major_func;
  Int16 post_status;
  struct{
    Uint16 spare : 4;
    Uint16 batt_fail : 1;
    Uint16 streaming : 1;
    Uint16 pump_on : 1;
    Uint16 valve_closed : 1;
    Uint16 pad : 8;
  }subfunc1;
......
......
}VS_STATUS
dove Int16 è precedentemente definito come Short e Uint16 come Unsigned
short;
come posso tradurre questa struttura in Pascal ???
esiste la possibilità di dare una lunghezza predefinita ad un tipo di dato
come ad esempio un word ???
grazie a tutti per l'interessamento.
------------------------------------------------
Sergio del Rosso
He@ltech Group
Project DRIVE Researcher
Scientific Institute H San Raffaele
Laboratory Medicine Dept.
Via Olgettina, 60
20132 Milano Italy
Phone:  
+39 02 2643.2803
Fax: 
+39 02 2643.2992
e-mail: 
delross...@hsr.it

 }VS_STATUS
dunque uint16 lo puoi tradurre con "word", mentre int16 con smallint.
Alla pagina Integer types della guida, c'e' l'elenco di tutti i tipi interi
con scritto quanto occupano e tutto il resto..
quel : N non so cosa significhi sinceramente..

A Sergio {MSX} rispondeva:

E' un campo bitmap: batt_fail, streaming, pump_on, valve_closed
occupano - se non erro - il nibble meno significativo del primo byte di
una word (per maggiori dettagli v. il K&R):
msb    1° byte     lsb      msb     2° byte    lsb
7  6  5  4  3  2  1  0      7  6  5  4  3  2  1  0
--spare---                  ---------pad----------
Sfortunatamente non esiste una traduzione diretta in pascal: ti
consiglio di mettere una word nella struct e definirti un set di
funzioni che ritornino un booleano dandogli in pasto quel campo.
Considera poi che la struct in C puo' o meno essere allineata a una word
o ad un dword: mi ci sono appena trovato in mezzo e l'unica e' a) sapere
come e' stata compilata la DLL, b) fare dei tentativi finche' i valori
tornati sono ragionevoli.
Considera anche la dimensione degli Enum: Delphi usa la minima
dimensione compatibile col numero di valori enumerati, a meno di usare
$MINENUMSIZE
Saluti
Paolo Arosio

come posso tradurre questa struttura in Pascal ???
La mappatura bit per bit che il C++ ti consente di fare non
e' ricostruibile in Pascal.  Tra l'altro ci sono questioni
di allineamento da considerare.  E' probabile che la
struttura sia allineata ai 16 bit, per cui entra in un Word.
Devi fare delle prove.  Riempi il campo della struttura in
C++ con un valore ed estrai i diversi bit in Delphi.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

ti ringrazio e considero la tua risposta la giusta via per la risoluzione al
problema.
ho trovato più in là nel codice in c un costrutto di questo tipo:
/* Subfunc1 bit field masks */
enum VS_SF1_BitMask {
  SF1_SPARE = 0x000F                       /* in binario 1111 */
  SF1_BATT_FAIL = 0x0010               /* in binario 10000 */
  SF1_STREAMING = 0x0020             /* in binario 100000 */
  SF1_PUMP_ON = 0x0040                 /* in binario 1000000 */
  SF1_VALVE_CLOSED = 0x0080      /* in binario 10000000 */
  SF1_PAD = 0xFF00                            /* in binario 11111111 */
};
credo che lo spare e il pad siano non significativi, mentre BATT_FAIL ,
STREAMING, PUMP_ON, VALVE_CLOSED occupino rispettivamente il 5°, 6°, 7° e 8°
bit del secondo byte del word, dato che ad ogni esadecimale corrispondono 4
bit.
correggetemi se sbaglio o sono impreciso.
grazie di nuovo.
