Newsgroup: it.comp.lang.c++
Titolo: Variabili membro e bit field

Ciao a tutti ,
ma e' un errore una inizializzazione presente in questo costruttore :
 struct RECORD  {
	 unsigned int NumRecord ;
	 long Date , Time ;
	 char DescrizioneGuasto[26] ;
	 char Localita[16] ;
	 char Ct[16] ;
	 int Vettura , VarVettura ;
	 char Linea[4] ; int Tabella ;
	 long Kilometri ;
	 unsigned int ClasseVettura ;
	 char TipoIntervento ;
	 char Richiesta ;
	 char Aut[26] ; long Matricola ;
	 unsigned int Cancellato : 1 ;
	 unsigned int Unused     : 7 ;
	 RECORD(void) ;
	 void operator=(RECORD &copia) ;
	 } ;
 RECORD::RECORD(void)
{
 Cancellato = NumRecord = 0 ;
}
main()
{
 RECORD rectemp ;
 return 0 ;
}
Il compilatore (Borland C++ 5) non riesce ad inizializzare a 0 il
membro RECORD::NumRecord ?
Come mai non segnala un errore ? 
N.B. Programma Ms-Dos
~~~~~~~~~~~~~~~~~
MAINARDI Gianfranco
Burago di Molgora (MI)
Italia
Email : 
main...@rete039.it
ICQ# number : 31334916
~~~~~~~~~~~~~~~~~

Cancellato = NumRecord = 0 ;
prova a fare cosi:
Cancellato = 0 ;      //valore di 1 bit
NumRecord = 0 ;   //intero
Per la cronaca io sono riuscito a compilare il tuo sorgente cosi'
com'e' con C++ Builder 3.0.
Forse il tuo compilatore fa un controllo + stretto dei tipi?
-------------------------------------------------
Gianluigi Rubino e-mail: 
cman...@altavista.net
C++ Maniacs : 
http://welcome.to/c++maniacs
Da qui puoi scaricare il libro:
"Thinking In C++" by Bruce Eckel
-------------------------------------------------

-------------------------------------------------
~~~~~~~~~~~~~~~~~


  struct RECORD  {
...
Scusami non ho compreso fino in fondo come controlli  lo stato di
Cancellato e NumRecord ...
ti faccio la domanda perché io con Builder Pro utilizzado lo watch delle
variabili long in fase di debug ho avuto delle sorprese del tipo che il
debugger mi mostrava dei valori che non corrispondevano allo stato reale
della variabile.
Me ne sono accorto utilizzando dei campi di Edit nel form, o stampando il
valore con delle MessageBox.
occhio poi che nel codice a 32bit gli iteri sono di 4 byte.
in Builder c'é una direttiva "#pragma pack" che ti permette di cambiare
l'impacchettamento delle strutture.
Ciao by Lucio.

Cancellato e NumRecord ...
Eseguendo il programma sotto Turbo Debugger ed ispezionando le
variabili . I valori di inizializzazione risultano casuali ed
osservando le istruzioni eseguite dalla CPU sembra che quest'ultima
appaia "confusa" quando cerca di inizializzare la variabile membro
'NumRecord' .
 
Questo e' il listato generato da Turbo Debugger 5.0 .
RIPETO : programma a 16 bit 
In [bp+06] si trova l'indirizzo dell'oggetto RECORD .
La variabile membro NumRecord essendo il primo dato della struttura si
trova esattamente a [bp+06] mentro il dato membro Cancellato ha un
offset di 74(esa) byte .
RECORD::RECORD:  RECORD::RECORD(void)
  cs:000F 55             push   bp
  cs:0010 8BEC        mov    bp,sp
#IO#31: {
  cs:0012 66837E0600     cmp    dword ptr [bp+06],00000000
  cs:0017 7512         jne    #IO#32 (002B) ; SALTA A #IO32#
  ; **********  righe non eseguite ******************
  cs:0019 6A75           push   0075
  cs:001B 9A9215B02E     call   far operator new
  cs:0020 59             pop    cx
  cs:0021 895608         mov    [bp+08],dx
  cs:0024 894606         mov    [bp+06],ax
  cs:0027 0BC2           or     ax,dx
  cs:0029 742B           je     #IO#34 (0056)
  ; *************************************************
#IO#32:  Cancellato = NumRecord = 0 ; ** qui l'inizializzazione
e'sbagliata **
  cs:002B C45E06         les    bx,[bp+06]
  cs:002E 268B07         mov    ax,es:[bx]
  cs:0031 33D2           xor    dx,dx
  cs:0033 8AC2           mov    al,dl
  cs:0035 8AC2           mov    al,dl
  cs:0037 250100         and    ax,0001
  cs:003A C45E06         les    bx,[bp+06]
  cs:003D 26806774FE     and    es:byte ptr [bx+74],FE
  cs:0042 26084774       or     es:[bx+74],al
#IO#33:  NumRecord = Cancellato = 0 ; ******* qui invece e'corretta
*********
  cs:0046 C45E06         les    bx,[bp+06]
  cs:0049 26806774FE     and    es:byte ptr [bx+74],FE
  cs:004E C45E06         les    bx,[bp+06]
  cs:0051 26C7070000     mov    es:word ptr [bx],0000
#IO#34: }
  cs:0056 8B5608         mov    dx,[bp+08]
  cs:0059 8B4606         mov    ax,[bp+06]
  cs:005C 5D             pop    bp
  cs:005D CB             retf
Come credo appaia dal listato i passi da #IO#32 fino a #IO#33 non
fanno alcun riferimento al dato presente in [bp+06] . Il compilatore
sembra generare istruzioni "confuse" :
  cs:0031 33D2           xor    dx,dx   ; ???
  cs:0033 8AC2           mov    al,dl   ; ???
  cs:0035 8AC2           mov    al,dl   ; ???
  cs:0037 250100         and    ax,0001 ; ???
mentre invece sono corrette le istruzioni che inizializzano
'Cancellato' :
  cs:003D 26806774FE     and    es:byte ptr [bx+74],FE  ; ok
  cs:0042 26084774       or     es:[bx+74],al           ; ok 
Invertendo la disposizione dei dati membro (passi da  #IO#33 fino a
#IO#34 ) le istruzioni sono corrette e i membri correttamente
inizializzati .
Credo che il compilatore dovrebbe perlomeno emettere un "WARNING" . 
O no ? 



iQA/AwUBNwFfu39t9oJRSnUyEQIXggCfYVq1oB4TwQbgPDDyt3BXSeK5DYEAniMI
4pxL00t/uT3/7nEXsrQbGrvt
=oLgo
-----END PGP SIGNATURE-----