pointery C

Miroslav Mraz mraz na seznam.cz
Úterý Květen 21 21:14:08 CEST 2013


Nehledejte v tom složitosti.
1. Pokud se ten union má vejít do 1 bytu, bude lépe místo unsigned, kde
překladač předpokládá unsigned int, což budou patrně 2 byty použít
unsigned char (lépe uint8_t ze stdint.h).
2. To složité přetypování mi přijde docela zbytečné, pracoval bych s tím
asi takto:
  _ProgramEEprom* pTest;
  pTest = &ProgramRAM[Program][RAM_AutoMesic];

  
  tmp = (*pTest).value;   // takhle
  tmp = pTest->value;     // nebo stejne
  tmp = pTest->Mesic;

Nebo jsem něco přehlédl ?

Mrazík

Miroslav Draxal píše v Út 21. 05. 2013 v 13:29 +0200:
> Dobrý den,
> 
> Toto je pokračování vlákna“ C _ jak rozepsat řádek“. Bylo zpřetrháno,
> tak proto nově.
> 
>  
> 
> Opět ukazatele. Mocný nástroj, ale složitý!!!
> 
>  
> 
> typedef union {
> 
>     char value;
> 
>  
> 
>     struct {
> 
>                unsigned Bit0 : 1;
> 
>                unsigned Bit1 : 1;
> 
>                unsigned Bit2 : 1;
> 
>                unsigned Bit3 : 1;
> 
>                unsigned Bit4 : 1;
> 
>                unsigned Bit5 : 1;
> 
>                unsigned Bit6 : 1;
> 
>                unsigned Bit7 : 1;
> 
>     } Bits;
> 
>  
> 
>     struct {
> 
>                unsigned cas : 7;
> 
>                unsigned bit_PROLNpauza : 1; // set = prolnutí
> 
>     } ProlnutiPauza;
> 
>  
> 
>     struct {
> 
>                unsigned Mesic : 5;
> 
>                unsigned AutoOnOff : 1;
> 
>                unsigned EndProgram : 1;
> 
>     };
> 
> } _ProgramEEprom;
> 
>  
> 
> _ProgramEEprom ProgramRAM[PocetProgEEprom][DelkaProgEEprom]
> 
>  
> 
> char *pTest
> 
>  
> 
>                pTest = &ProgramRAM[Program][RAM_AutoMesic].value;
>           // na adrese D0 je 0x0B
> 
>                tmp =(*((_ProgramEEprom*)*pTest)).value;
>                                       // načte 1 - chyba
> 
>                tmp =
> *pTest;                                                                                             // načte 0x0B - ok
> 
>  
> 
> Je problém s 
> 
> tmp =(*((_ProgramEEprom*)*pTest)).value;// načte 1
> 
> tmp =(*((_ProgramEEprom*)*pTest)).mesic;// načte taky 1
> 
>  
> 
> ale načítat by měl 0x0B. Co mi zase uniká? Míra
> 
> 
> 




Další informace o konferenci Hw-list