*****SPAM***** Re: C _ jak rozepsat ?__ádek

Jan Waclawek konfera na efton.sk
Neděle Duben 28 21:59:44 CEST 2013


>Vzhledem k tomu, ze memcpy ma ukazatele jako void* tak se musi poprat se 
>vsemi zaludnostmi, ne? 

To void* je formalna deklaracia, ktorou sa hovori, ze memcpy() ma
akceptovat akykolvek pointer. V skutocnosti moze byt memcpy()
implementovany tak, ze berie typ pointra do uvahy (a moze sa inlinovat,
generovat kompilatorom, atd.atd. - ale to nesuvisi, len ilustruje, ze
nemusite len z citania kniznice vediet, ako to presne bude prelozene); a
ak je to pointer na word, tak ta implementacia moze predpokladat spravne
zarovnanie. Ba dokonca pointer moze priamo v sebe niest typ na ktory
ukazuje - implementacia pointra nie je predpisana, len jeho spravanie. No
a pointa toho, preco memcpy() ma v nasom konkretnom pripade dovolene
zlyhat je v tom, ze uz tym pretypovanim nespravne zarovnaneho
cisla/pointra vznikne nespravny pointer, a jeho pouzitie *kdekolvek* inde
v programe (t.j. aj v kniznicnej funkcii) moze vyvolat chybu; pretypovanie
(ci uz formalne alebo explicitne) na void* ten pointer automaticky
"neopravi".

Toto je ten zasadny rozdiel medzi "mne to funguje" a skutocnym programom.

>Taky jsem to jednou zkoumal a zarovna si zacatek, 
>konec po Bytech nebo half wordech a prostredek jede po wordech...

Skumali ste jednu konkretnu implementaciu. Pisal som predsa, ze zadrhel je
v prenositelnosti; este som uviedol aj konkretny pripad, kde Vam to
fungovat nebude. Pokuste sa raz nebyt taky povrchny a citat vsetko.

>Zrovna tak jako memmove by mela resit prekryti oblasti libovolnym zpusobem.

To s tym vobec nijako nesuvisi; tato vlastnost memmove vyplyva z jej
definicie.

wek
 -


Další informace o konferenci Hw-list