LSB je int. buf je char *. Potřebuji do buf nakopírovat 4 byty z LSB (z leva doprava). Zkouším dvě možnosti:
1)
buf[0] |= LSB & 0xFF000000;
buf[1] |= LSB & 0x00FF0000;
buf[2] |= LSB & 0x0000FF00;
buf[3] |= LSB & 0x000000FF;
nic to nedělá
2)
memcpy(buf, (int) &LSB, 4); // přepiš 3 byty od konce
taky nic to nedělá
buf: 0x22e864 "Aenean."
LSB: 196611
Když vymažu operátor & u memcopy tak mám hlášení: makes pointer from integer without a cast [enabled by default]| include\string.h|38|note: expected 'const void *' but argument is of type 'int'| Přímo LSB jako source tam dát nemohu, to by krachlo. Co s tím?
varianta jedna nic nekopiruje (operator |= neni kopie), krom toho se ti vysledek u 3 ze 4 osekne na jeden byte, takze vzdy budes delat or s 0 coz je puvodni hodnota. Nejmene u toho na indexu 3 bych cekal mensi zmenu.
Varianta dve by mohla i fungovat, ale bude zalezet na byte orderu. Na vetsine oblibenych procesoru bude prvni LSB (little endian). A podle prvni varianty hadam, ze to bude presne obracene.
Nahlásit jako SPAM
IP: 217.196.214.–
Program vždy dělá to co naprogramujete, ne to co chcete...
#6oxidián
na to, aby se ti dalo odpovedet, bych musel vedet, jakeho typu jsou m, LSB.
Proc napriklad delas ~0xFFFF0000, kdyz rovnou muzes zapsat 0xFFFF (respektive 0xFFFFU, aby to bylo bez znamenka). No a kdyz to pak jeste posunes o 16, tak vlastne zbyde zase 0xFFFF0000. No a tim pak vymaskujes to m[i].
// priklad:
unsigned int val = 0xDEADBEEFU;
printf("0x%08x\n", (val & ~0xFFFF0000U) << 16); // prints: 0xbeef0000
printf("0x%08x\n", val & ~0xFFFF0000U << 16); // prints: 0xdead0000
Nahlásit jako SPAM
IP: 37.188.252.–
Program vždy dělá to co naprogramujete, ne to co chcete...
LSB = m[i] & 0xFFFF0000u; // to je to co tam ted mas na druhem radku
LSB |= m[i+1] & 0xFFFFu; // urcite neprepise nic nad 16. bit, jelikoz se tam nemuze vyskytnout zadna logicka jednicka.
Nahlásit jako SPAM
IP: 37.188.252.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jak jsi asi pochopil, tak se v pozicnich soustavach pocitaji pozice od desetinne carky (z prava do leva), za desetinnou carkou jsou pak zaporne. 0b0,1 by pak bylo: 1 * 2^(-1) = 0.5 dekadicky
Nahlásit jako SPAM
IP: 37.188.252.–
Program vždy dělá to co naprogramujete, ne to co chcete...
memcpy(buf, (int) &LSB, 4); // přepiš 3 byty od konce
šílenej guláš. Získáš ukazatel, ten přetypuješ na int a cpeš ho jako parametr funkci memcpy, která chce ukazatel. Navíc podle třetího parametru memcpy se kopírují 4 Byty.
Nebylo by od věci rozepsat si všechno do jednotlivých řádků a krokovat v debuggeru a dívat se na hodnoty proměnných.
Pochybuji, že by z tebe mohl být alespoň průměrný lepič kódu (jako jsem já) když ses do teď nenaučil ani základní věci probírané v kdejakém tutoriálu. Za dobu, kterou sem na fórum chodíš, jsem dokázal sestavit "woknovou" aplikaci, která četla z COMu, zobrazovala průběžně hodnoty a ukládala je do souboru. Nebylo to kdovíjak učesané, ale fungovalo to spolehlivě. Co vše umí WinAPI nebo co je objektové programování jsem ještě nevěděl, ale používání datových typů a ukazatelů jsem znal.
Jsou to tvoje pochyby ne moje. Za dobu co jsem chodím jsem se věnoval třem, respektive čtyřem jazykům. Céčko jsem skoro úplně zapomněl, takže je to jako bych začal právě teď. Ale neboj já si zase rozpomenu.