ukazatel typu void to char

Josef Štengl ok1ced na nagano.cz
Sobota Duben 8 00:06:52 CEST 2017


Já ten zápis chápu tak, že se provede volání fce _eeprom_read() a výsledek se zahodí, a zbytek výrazu se děj vůle autora 
kompilátoru ...

proč?

6.8.3 Expression and null statements
....

EXAMPLE 1 If a function call is evaluated as an expression statement for its side effects only, the
discarding of its value may be made explicit by converting the expression to a void expression by means of
a cast:
int p(int);
/* ... */
(void)p(0);



6.3.2.2 void
The (nonexistent) value of a void expression (an expression that has type void) shall not
be used in any way, and implicit or explicit conversions (except to void) shall not be
applied to such an expression. If an expression of any other type is evaluated as a void
expression, its value or designator is discarded. (A void expression is evaluated for its
side effects.)

The void type comprises an empty set of values; it is an incomplete object type that
cannot be completed.

A pointer to void shall have the same representation and alignment requirements as a
pointer to a character type.



Mimochodem, proč si funkci
void _eeprom_write_object(unsigned int ee_addr, void *pObj, unsigned char obj_size)

nedefinujete rovnou jako
void _eeprom_write_object(unsigned int ee_addr, uint8_t *pObj, unsigned char obj_size)
?

Na pointer na char se dá přetypovat každý pointer (má podobné vlastnosti jako pointer na void).
A bylo by po problému, protože s tím pak zacházíte jako s char.
Já ten zápis chápu tak, že se provede volání fce _eeprom_read() a výsledek se zahodí, a zbytek výrazu se děj vůle autora 
kompilátoru ...

proč?

6.8.3 Expression and null statements
....

EXAMPLE 1 If a function call is evaluated as an expression statement for its side effects only, the
discarding of its value may be made explicit by converting the expression to a void expression by means of
a cast:
int p(int);
/* ... */
(void)p(0);



6.3.2.2 void
The (nonexistent) value of a void expression (an expression that has type void) shall not
be used in any way, and implicit or explicit conversions (except to void) shall not be
applied to such an expression. If an expression of any other type is evaluated as a void
expression, its value or designator is discarded. (A void expression is evaluated for its
side effects.)

...

The void type comprises an empty set of values; it is an incomplete object type that
cannot be completed.

A pointer to void shall have the same representation and alignment requirements as a
pointer to a character type.

Takže tady by ta inkrementace pointru na void  byla i správně


Mimochodem, proč si funkci
void _eeprom_write_object(unsigned int ee_addr, void *pObj, unsigned char obj_size)

nedefinujete rovnou jako
void _eeprom_write_object(unsigned int ee_addr, unsigned char * pObj, unsigned char obj_size)
? Ušetřil by jste si spoustu starostí.


Na pointer na char se dá přetypovat každý pointer (má podobné vlastnosti jako pointer na void).
A bylo by po problému, protože s tím pak zacházíte jako s char.
Dne 7.4.2017 v 19:00 Miroslav Draxal napsal(a):
> Pro čtení jsem to udělal takhle, sice to hlásí varování o nepředvídatelném
> chování, ale koukl jsem na disa. a tam není žádný problém.
> Takže jsem pro tenhle řádek vypnul hlášení varování.
> *pObj++ = (void) _eeprom_read(ee_addr++);
>
> Jakou paseku by tenhle kód mohl dělat? Nenapadá mě nic.
>
> -----Original Message-----
> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Jan Waclawek
> Sent: Friday, April 07, 2017 3:48 PM
> To: HW-news
> Subject: RE: ukazatel typu void to char
>
> Hm tak ak mate zapnute aj vsetky optimalizacie, tak to je zvlastne, lebo
> toto je bezne pouzivana paradigma.
>
> V skutocnosti je to asi jedina uzitocna aplikacia pre void*.
>
> V kazdom pripade vsak este stale nedoporucujem robit nic ine ako pouzit tu
> "pomocnu" premennu.
>
> wek
>
>
>> Ano, poslední XC8 v1.41 pro.
>>
>> -----Original Message-----
>>
>> A mate tu plnu verziu prekladaca?
>>
>> wek
>>
>>
>> ----- Original Message ---------------
>>> Jo, jenľe kdyľ se podívám do disas. (coľ je moje váąeň, jak to dělají)
>>> tak tam mám 3x nesmyslné předávání hodnot z ram do ram, neľ tu adresu
>> pouľije.
>>> Rád bych se tomu vyhnul.
>>>
>>> -----Original Message-----
>>>
>>> No len si ho pekne urobte, predidete tym zbytocnym problemom.
>>>
>>> wek
>>>
>>>
>>> ----- Original Message ---------------
>>>> Nechce se mi "zřizovat" pomocný ukazatel *p.
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>


Další informace o konferenci Hw-list