(void) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

(void) – C / C++ – Fórum – Programujte.com(void) – C / C++ – Fórum – Programujte.com

 

liborb
~ Redaktor
+18
Guru
18. 5. 2011   #1
-
0
-

Chtěl jsem se zeptat, jestli někdo netuší, co tím přetypováním na void chtěl autor říci. Zatím jsem dospěl k názoru, vzhledem k udelay předtím, že to souvisí s časováním.

static inline void iowrite8_slow( u8 value, void __iomem* addr )

{
static volatile u8 tmp;
iowrite8(value, addr);
udelay(1);
(void)tmp;
}

Nahlásit jako SPAM
IP: 78.80.52.–
KIIV
~ Moderátor
+43
God of flame
18. 5. 2011   #2
-
0
-

To liborb : nepripada mi, ze by to mohlo mit nejakou funkci krom par instrukci navic (coz by melo teoreticky zpusobit volatile)
neni to na nic navazany, nikam se hodnota nepredava, dokonce se ani neinicializuje... asi je to jen forma nop
neurcuje se ani nejake umisteni, kde by mela byt ulozena

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
18. 5. 2011   #3
-
0
-

To KIIV : To je právě to :) ... chvilku jsem si říkal, že to tam třeba jenom zapomněl a pak jsem chvilku googlil a našem jsem i jiné zdrojáky, kde je to taky použité, jakoby to byla ta nejběžnější konstrukce ;). Třeba to někdo z "místních" používá a ví proč.

Nahlásit jako SPAM
IP: 78.80.52.–
KIIV
~ Moderátor
+43
God of flame
18. 5. 2011   #4
-
0
-

To liborb : nebo to vsichni kopirujou a ani nevi proc? ne fakt netusim na co by to mohlo byt... mozna kouknout co se vygeneruje v assembleru ...

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
voty+1
Návštěvník
18. 5. 2011   #5
-
0
-

Sice netuším pro jakou platformu je zdroják míněn, nicméně tato konstrukce by IMHO měla vyvolat čtení z paměti, možná je to potřeba po zápisu do IO space. (tmp je volatile, přetypování na void by mělo přečtenou hodnotu asi jen zahodit).

Nahlásit jako SPAM
IP: 217.195.166.–
Jednu rozbil a tu druhou ztratil.
nervak0
Věrný člen
18. 5. 2011   #6
-
0
-

Jestli je to MMIO, tak čtení po zápisu bude nějaká synchronizace.

Edit: Vlastně to ani nemusí být MMIO.

Nahlásit jako SPAM
IP: 213.211.51.–
liborb
~ Redaktor
+18
Guru
19. 5. 2011   #7
-
0
-

Je to z CAN ovladače na ARM/Linux. A synchronizace mi jako vysvětlení této "záhady" stačí :). Děkuji

Nahlásit jako SPAM
IP: 78.80.52.–
voty+1
Návštěvník
24. 5. 2011   #8
-
0
-

To liborb :
Ještě jen zajímavá informace z ISO 9899:1999

An actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no needed side effects are produced (including any caused by calling a function or accessing a volatile object).



Kdy o side effects hovoří jiný odstavec a to

The expression in an expression statement is evaluated as a void expression for its side effects.



Přičemž z uvedeného mi vyplývá, že poptávaná konstrukce je jediná správná, aby přístup k volatile tmp nebyl překladačem zahozen, neboť přetypováním na void dáváme překladači jasně najevo, že tento řádek je tu kvůli side efektu.

Nahlásit jako SPAM
IP: 217.195.166.–
Jednu rozbil a tu druhou ztratil.
nervak0
Věrný člen
25. 5. 2011   #9
-
0
-

Aha, ono jde přímo o to "(void)", měl bych číst pečlivěji :) Tak to taky netuším.

To voty : Tak to ti vyplývá špatně.

Nahlásit jako SPAM
IP: 213.211.51.–
voty+1
Návštěvník
25. 5. 2011   #10
-
0
-

To nervak : Je klidně možné, že se mýlím, ale šlo by to nějak rozvést?

Nahlásit jako SPAM
IP: 217.195.166.–
Jednu rozbil a tu druhou ztratil.
nervak0
Věrný člen
25. 5. 2011   #11
-
0
-

To, co tam ten příkaz podrží a vynutí čtení je volatile.
To přetypování tady nemá vliv na funkci a myslím, že ani na vygenerovaný kód, nebo varovná hlášení.

Nahlásit jako SPAM
IP: 213.211.51.–
liborb
~ Redaktor
+18
Guru
26. 5. 2011   #12
-
0
-

No ... a aby toho nebylo dost :), tak o kus dál je to samé, ale bez volatile ...

uint8_t cancont = ioread8_slow( &r->cancont );

uint8_t canstat = ioread8_slow( &r->canstat );
int result;
(void)canstat;
(void)cancont;


A vzhledem k tomu, jak je kód formátovaný, tak tím autor chtěl asi říct, že to patří k deklaracím.

Nahlásit jako SPAM
IP: 78.80.52.–
liborb
~ Redaktor
+18
Guru
26. 5. 2011   #13
-
0
-
Nahlásit jako SPAM
IP: 78.80.52.–
voty+1
Návštěvník
26. 5. 2011   #14
-
0
-

Pro potlačení těchto warnings se to "běžně" používá, protože to překladač při překladu obvykle zahodí, ale právě to spojení s volatile je takové zvláštní. Poslední věc co mě napadá, že by to šlo použít, aby si nestěžovaly nástroje na analýzu kód, že se používá neinicializovaná proměnná.

Ještě k tomu volatile, dle standardu C99 mi přijde, že přístup k volatile (čtení) může překladač také zahodit, pokud uzná, že hodnota není potřeba, nebo nemá žádný side-effect.

Nahlásit jako SPAM
IP: 81.19.47.–
Jednu rozbil a tu druhou ztratil.
nervak0
Věrný člen
26. 5. 2011   #15
-
0
-

To voty : V Linuxu je standard implementace GNU C v GCC.

To liborb : Je to někde dostupné celé?

Nahlásit jako SPAM
IP: 213.211.51.–
liborb
~ Redaktor
+18
Guru
27. 5. 2011   #16
-
0
-

To nervak : Není. A zveřejňovat to ani nechci neb nejsem autorem (a navíc je to v podstatě placené). Mě to vysvětlení, že je to proto, aby byl gcc šťastný, stačí.

Nahlásit jako SPAM
IP: 78.80.52.–
voty+1
Návštěvník
27. 5. 2011   #17
-
0
-

To nervak : Ano, to jistě je, jen je potřeba se dohodnout, kterou verzi GCC máš na mysli :-) Autoři GCC jsou známi tím, že na většinu stížností, že nová verze něco rozbila, reagují tak, že standard jim to dovoluje, tedy není si na co stěžovat. Což leckdy vyústilo i v bezpečností chyby jádra atd.

Nahlásit jako SPAM
IP: 81.19.47.–
Jednu rozbil a tu druhou ztratil.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 96 hostů

Podobná vlákna

Void* — založil expoox

Void* na byte[] v C# — založil Radek Chalupa

Void * alebo delegate z c# — založil Miro1701

Public void PredstavSe() — založil Montezo

Typedef void* ve VB.NET — založil Štefan Kakaš

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý