Newsgroup: it.comp.lang.c++
Titolo: due consigli sui POD e si tipi unsigned

Saluti a tutti, e' molto tempo che non frequento questo
newsgroup, come vanno le cose?
Scrivo per avere dei consigli per un programma di cui mi sto
occupando (per un sistema embedded fra l'altro).
La prima e' questa:
ho delle strutture di tipo bit field del tipo:
struct layout
{
   unsigned char a : 4;
   unsigned char b : 4;
   unsigned char c : 3;
   unsigned char d : 5;
};
struct layout2: public layout
{
   unsigned char e : 4;
   unsigned char f : 4;
};
e vorrei fare una cosa del genere
class A: public layout
{
};
class B: public layout2, public A
{
};
Ovviamente cosi' non va bene e la cosa si risolve usando la derivazione
virtuale per layout2.
La mia preoccupazione e se in questo caso layout resta un POD perche'
devo usare queste strutture a basso livello (in pratica castare da
un array di memoria).
Il secondo consiglio riguarda questo:
unsigned long a = 10, b = 20;
long c = a - b;
in questo caso (non essendoci un tipo intero signed piu' grande
di unsigned long) il risultato di a - b e' unsigned, quindi sbagliato.
Tuttavia convertendolo in long le cose funzionano.
Mi interessa sapere se questo comportamento e' standard oppure implementation
dependent. 
Saluti e grazie  Manlio Perillo

 array di memoria).
No, non è un POD. Affinché una struttura sia un POD è indispensabile che
valgano le condizioni previste nella definizione di "trivial constructor".
Assenza di basi virtuali è una di queste condizioni. Vedi 12.1.
La derivazione virtuale comporta l'introduzione di una vtable.
Max

implementation dependent. 
E' implementation dependent... 4.7/3 sui miei documenti
non ufficiali:
 "If the destination type is signed, the value is
  unchanged if it can be represented  in the destination
  type (and bit-field width); otherwise, the value is
  implementation-defined."
In questo caso il valore di a-b e' un numero positivo
molto grande che non puo' essere rappresentato nel tipo
di destinazione e quindi si applica questa clausola.
Probabilmente comunque la cosa funziona su tutte le
architetture che usano notazione binaria in complemento
a 2 per gli interi con segno.
HTH
Andrea


Lo sospettavo, grazie per la conferma.
Saluti  Manlio Perillo

controllo sugli accessi di memoria?
Alcuni processori utilizzano un I/O "mappato", ovvero
ci sono locazioni che il processore in quanto tale non
sa se sono memoria RAM, ROM o locazioni di I/O ma che
la logica di contorno "tiene d'occhio" per intercettare
le richieste di I/O. Su x86 questo non succede (ci sono
istruzioni dedicate di I/O) ma ad esempio su Apple ][
la lettura la locazione 0xC010 provocava l'ACK alla
tastiera sul segnale di tasto premuto, o la lettura di
0xC030 una commutazione sull'altoparlante.
Se tu allochi un bitfield di 3 bit lo standard C e C++
non solo non dicono quali 3 bit saranno allocati, ma
nemmeno che se scrivi su quel campo quante saranno
le locazioni che saranno effettivamente lette/scritte
(potrebbe essere un byte, un paio, quattro...)
Se si tratta di RAM la cosa non fa (quasi) differenza,
se si tratta di I/O mappato di differenza ne fa eccome.
Ho detto "quasi" perche' comunque quali sono le locazioni
lette/scritte potrebbe avere anche implicazioni nell'uso
di bitfield in programmi multithread... cioe' se due
thread modificano bitfield "vicini" nessuno garantisce
che non ci siano problemi. E cosa significhi "vicini"
dipende dal compilatore.
Andrea


Allora non credo che ci siano problemi. Nel mio caso ho semplicemente
un buffer di memoria del tipo
struct Signal
{
    unsigned char data[126];
    // ...
};
che ricevo dal sistema operativo. Non uso multithreading.
Comunque, ripensando a come implementare meglio il codice,
la sua struct BitField mi ritorna molto utile.
L'unica modifica che devo fare e' passare il puntatore a data
nel costruttore. Ci sono controindicazioni?
P.S. sbaglio o ultimamente i messaggi O.T. su questo newsgroup
sono aumentati in modo esponenziale?
Saluti e grazie.

sono aumentati in modo esponenziale?
Ultimamente seguo questo NG abbastanza di rado :( ... e
molti messaggi dal topic poco ispirato neppure li apro.
Forse sto invecchiando :) ... e comincio a preferire il
godermi i tramonti al farmi insultare e prendere in giro.
Andrea


Come darti torto?
