Stránka 2 z 2
Napsal: 01 črc 2018, 20:13
od MiloPS3

ze ti to trvalo ..
a co je na tom radku ?
Napsal: 02 črc 2018, 12:18
od nvenca
Bohužel už nemohu zjistit co to bylo za řádek. Ještě večer jsem totiž ten prográmek okomentoval a učesal, což se po překladu a spuštění samozřejmě přepsalo i na disku a ten warning zmizel. Ale pokud si vzpomínám, bylo to něco kolem řádku s tím uložením výsledku bitového posuvu do proměnné.
Můžu jen vložit tu současnou verzi, která to ovšem už nehlásí.
Ale ta poznámka o trvání než se rozsvítilo mne inspiruje ke konstatování že stejně nechápu proč se v progamech běžně vyskytuje příkaz x++ aniž by bylo třeba použít přiřazení nové hodnoty x do proměnné x (např. v Herout: "Učebnice jazyka C" je příklad cyklu while
while (x < 10)
x++
a v mém programu to nefungovalo. Připadá mi to jako obdobná situace, jen s jiným operátorem. Nebo snad to znamená že u bitových operací je nutno ten výsledek ještě přiřazovat a u jiných ne?
Napsal: 02 črc 2018, 12:39
od rnbw
Namiesto n=n>>1; mozes pouzit n >>= 1;
Napsal: 02 črc 2018, 12:47
od nvenca
Teď mne ještě napadlo jedno možné vysvětlení použití toho příkazu x++ bez přiřazení (tedy místo x=x++), a to že ten zjednodušený zápis lze použít JEN v případě změny řídící proměnné cyklu.
Např.
uint8_t x=0;
while (x<5)
{
x++;
PORTB=x;
}
Jak to tedy je?
Napsal: 02 črc 2018, 13:06
od nvenca
rnbw píše:Namiesto n=n>>1; mozes pouzit n >>= 1;
Ano, to už jsem našel taky, ale to je jen zjednodušená verze toho zápisu s přiřazením (možná bude i rychlejší ve výsledném běhu programu). Mně jde o to zjistit, v jakých situacích stačí zapsat n>>1; místo n>>=1; nebo n=n>>1;
Beru to totiž jako obdobu zápisu x++; místo x=x+1;
No a protože u n>>1; jsem narazil, hledám vysvětlení proč to u x++; jde a u n>>1; to nejde. Zda to jde jen proto, že jsem to našel u změny obsahu řídící proměnné cyklu nebo proto že u bitových operací to nejde použít, či je jiný důvod.
Napsal: 02 črc 2018, 14:43
od FHonza
vysvětlení je jednoduché, n>>1 není totéž co n>>=1
operátor >> je binární, tj má dva operátory a výsledek
takže když potřebuješ uchovat výsledek operace, je nutné ho někam uložit
n>>=1 je totéž co n=n>>1, překladač to přeloží stejně
operátor ++ je unární, tj x++ není totéž co x=x+1
Napsal: 02 črc 2018, 16:54
od nvenca
Díky za vysvětlení, konečně to má logický smysl. Ta jednička u n>>1 vlastně není obecně pevná konstanta, ale druhý operand a v operaci není implicitně určeno kam se má zapsat výsledek. Proto je nutné to přiřazení.
Naproti tomu je n++ pouhá inkrementace (o konstantní hodnotu 1) jednoho operandu a výsledek je implcitně přiřazen tomuto operandu.
Pokud jsem to dobře pochopil, měla by být možná i konstrukce příkazu
n=n>>k, kde pomocí proměnné k by šel v cyklu měnit krok posunu. Nevím sice k čemu by se to používalo, jde mi pouze o to zda to dobře chápu.
Napsal: 03 črc 2018, 11:18
od FHonza
Chápeš to dobře, je to druhý operand. I když je konstantní. Překladač to určitě přeloží efektivněji než když tam bude místo jedničky proměnná. Ale na funkčnosti to nic nemění.
S unárním operátorem ++ a -- je to malinko složitější, asi nejlíp je to k pochopení na příkladu (i když to přiřazení se v praxi používá málokdy):
To první přiřazení funguje tak, že se nejprve inkrementuje n o jedna na hodnotu čtyři a poté se do x dosadí čtyři.
Druhé funguje obráceně, nejprve se do x dosadí hodnota n (v příkladu by to byla čtyřka, protože nejprve proběhlo to první přiřazení), a poté se inkrementuje proměnná n na pětku.
Kdybys chtěl v elektronické podobě knížku se základy programování v C, tak mi napiš SZ, pošlu ti jí.
Případně na serveru
mcu.cz vycházel docela pěkný seriál o C zaměření na programování µC.
Napsal: 03 črc 2018, 20:34
od Atlan
Xc8 to je ten prekladac od mikrocipu co robi preklad z c do asm zkomplikovanim kodu?
Tj to co moze logicky trvat 4instrukcien prelozi na 8 instrukcii... V free verzii.
Mal sisi nainstalovat mplab ide 8.xx a prekladac hitechpro, na nete je niekde plna verzia.