Simulace běhu programu v MPLAB X IDE

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
MiloPS3
Příspěvky: 279
Registrován: 07 srp 2010, 00:00

#16 Příspěvek od MiloPS3 »

:aplause: ze ti to trvalo .. :wink:

a co je na tom radku ?
Uživatelský avatar
nvenca
Příspěvky: 117
Registrován: 28 úno 2012, 00:00
Bydliště: Brno

#17 Příspěvek 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?
Uživatelský avatar
rnbw
Příspěvky: 37418
Registrován: 21 bře 2006, 00:00
Bydliště: Bratislava

#18 Příspěvek od rnbw »

Namiesto n=n>>1; mozes pouzit n >>= 1;
Uživatelský avatar
nvenca
Příspěvky: 117
Registrován: 28 úno 2012, 00:00
Bydliště: Brno

#19 Příspěvek 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?
Uživatelský avatar
nvenca
Příspěvky: 117
Registrován: 28 úno 2012, 00:00
Bydliště: Brno

#20 Příspěvek 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.
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#21 Příspěvek 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
Uživatelský avatar
nvenca
Příspěvky: 117
Registrován: 28 úno 2012, 00:00
Bydliště: Brno

#22 Příspěvek 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.
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#23 Příspěvek 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):

Kód: Vybrat vše

n = 3;
x = ++n;
x = n++


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.
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#24 Příspěvek 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.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“