va_arg

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Sobota Červenec 23 12:24:06 CEST 2016


Bude to IMHO zbytecne narocne na zasobnik, to nemuzete ty bajty predat 
jako ukazatel na pole a pocet prvku???
proc nepouzivate rovnou sd[index++] = ... v prvnim pripade ?
Pokud neni potreba setrit pameti, tak bych rekl OK.

Dne 23.07.2016 v 11:26 Pavel Hudecek napsal(a):
> Díky za podrobné vysvětlení.
>
> Takľe teď tam mám:
>
> uint8_t sd[10];
> uint8_t *sendData;
> (...)
> sendData=sd;
> (...)
> sendData[index++] = (uint8_t)va_arg(fPar, uint32_t);
>
> Funguje a negeneruje warningy.
>
> A o kousek dál, kde chci přenáąet pole, na které byl předán pointer, je:
>
> sendData=(uint8_t *)va_arg(fPar, uint32_t);
>
> Taky funguje bez protestů.
> Je to tak správně, nebo je v tom nějaký potenciální zádrhel?
>
> PH
>
> -----Původní zpráva----- From: Jan Waclawek
> Na tento pripad sa vztahuje posledna veta C99, 6.5.2.2#7, ktora vravi, ze
> parametre odovzdane do elipsy podliehaju "default argument promotions",
> tieto promotions boli definovane predtym v C99, 6.5.2.2#6. To je to iste
> ako "integer promotions" (co je rozsirenie mensich typov na int alebo
> unsigned int) a naviac float sa rozsiri na double. Mimochodom, citat 
> normu
> v tomto bode je obzvlast neprijemne, pretoze je pisana s ohladom na 
> K&R aj
> "novy" styl deklaracie/definicie a pouzitia funkcii, a cele to nie je to
> bez komentara prilis zrozumitelne.
>
> Ergo, va_arg a spol. vobec nerataju s tym, ze by v elipse bolo schovane
> nieco mensie ako int (resp. double) a tak pri pokuse z tade vybrat nieco
> mensie to ma pravo urobit cokolvek skarede, co je napokon potvrdene aj
> priamo pri popise samotneho va_arg a spol v 7.15.1.1#2:
> If there is no actual next argument, or if type is not compatible with 
> the
> type of the actual next argument (as promoted according to the default
> argument promotions), the behavior is undefined [... nasleduju 2 vynimky
> ktore sa vsak netykaju tohto pripadu]
>
> Je to zataz z minulosti, dana mechanizmom odovzdavania parametrov v K&R.
> Nie zeby bolo technicky neriesitelne tie promotions nerobit, ale je to
> pevne zakotvene v norme, tak sa s tym treba zmierit.
>
> ----- Original Message ---------------
> Subject: va_arg
>   From: "Pavel Hudecek" <edizon na seznam.cz>
>> mějme funkci:
>>
>> void i2cSend(uint8_t adr, uint8_t bytes, ...) {
>> va_list fPar;
>> (....)
>> sendData[index++] = va_arg(fPar, uint8_t);
>> (....)
>> }
>>
>> Na řádku sendData... vznikl následující warning a poznámky:
>>
>> warning: 'unsigned char' is promoted to 'int' when passed through '...'
>> note: (so you should pass 'int' not 'unsigned char' to 'va_arg')
>> note: if this code is reached, the program will abort
>>
>> Abych pravdu řekl, vůbec nevím co si o tom mám myslet. Znamená to, µe 
>> va_arg
>> neumí unsigned char a µe bude argumenty µrát po dwordech, nebo µe stačí,
>> kdyµ před va_arg dám (uint8_t) a jinak bude v±e OK? 
>
> _______________________________________________
> 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