Pomoc se výkladem kodu

DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Pomoc se výkladem kodu

Příspěvek od DavidO »

Vladimir66 píše: 21 lis 2018, 21:15 jak se ulozi ten prvni parametr strip.Color(0, 25, 0) do promenne uint32_t c ?
To tě jako uživatele nemusí zajímat ;) tobě může stačit vědět, že to tam ta knihovna nějak udělá. Ale víme, že jseš člověk zvídavej, tak jo, je to jak Dex píše - že v nejnižším bajtu bude hodnota modré složky, v dalším zelené, v dalším červené a v nejvyšším bajtu bude 0. (uint32_t je 32 bitů tj. 4 byty a tak holt jeden zbývá (tam se ukládá bílá, kdybys použil všechny 4 složky)).
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek od daton »

Ahoj
no to mne taky napadlo tak jsem tam zkusil dat int jako proměnou i float a stejný výsledek ale když tam napiši

Kód: Vybrat vše

strip.setPixelColor(1,0) ;strip.show();
    delay(500);
    strip.setPixelColor(0,0) ;strip.show();
    delay(500);
tak to zhasne jak má, tedy postupně.
Mě jen zajímalo a stále zajímá proč nejde použít ten cyklus ke zhasnutí u těch posledních dvou. S tou proměnou máš pravdu ale pokud by tam byl float nebo int tak by to mělo chodit ne? V to příkazu pro neopixel to asi nebude.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Pomoc se výkladem kodu

Příspěvek od DavidO »

No tak já ti to řeknu polopatě: protože tam máš v podmínce i<0 ty lopato :-)
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek od daton »

Jasně Mirku Dušíne ale i když tam dám i<1 tak to taky nechodí ... je to rozbitý a nevim co stím :-)
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Pomoc se výkladem kodu

Příspěvek od DavidO »

<
Nastavíš i na jedničku. Uděláš akci. Zmenšíš i o jedničku. Pokud je i MENŠÍ než nula (nebo jedna jak jsi to napsal teď), jdeš do dalšího kola. Kolikrát to tedy uděláš?
Pardon, jsem lopata:
Nastavíš i na jedničku. Pokud je i MENŠÍ než nula (nebo jedna jak jsi to napsal teď), uděláš akci. Zmenšíš i o jedničku. Jdeš do dalšího kola na ten test. Kolikrát to tedy uděláš?
Naposledy upravil(a) DavidO dne 23 lis 2018, 11:06, celkem upraveno 2 x.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek od daton »

Počkej tak for příkazu si myslím že jakž takž rozumím a nikdy jsem s tím neměl problém až teď. Je tam jen jeden a to zásadní jak jsem pochopil tak s odečtem prováděným příkazem for se nedostanu s i na nulu.
Nejde to a třeba ano mám někde logickou chybu nebo si to špatně vysvětluji ale neumím ho napsat tak abych poslední kolo měl s i=0.
Proto mi to nechodí, jestli to umíš prosím poraď ... to je ten problém

Kód: Vybrat vše

 for(int i=3; i>0; i--) {  
   strip.setPixelColor(i,0) ;
   strip.show();
tohle ještě chodí ale když dám jako podmínku i=0 tak už ne a to jsem se nikde zatím nedočetl že to nelze.
Vladimir66
Příspěvky: 385
Registrován: 02 dub 2014, 15:30

Re: Pomoc se výkladem kodu

Příspěvek od Vladimir66 »

https://www.arduino.cc/reference/en/lan ... cture/for/
kdyz je podminka FALSE, tak se ukonci beh smycky.
muzes napsat: for(int i=2; i<4; i++)
nemuzes napsat: for(int i=2; i>4; i++)
nemuzes napsat: for(int i=4; i<2; i--)
nemuzes napsat: for(int i=2; i=4; i++)
nemuzes napsat: for(int i=2; i==4; i++)
muzes ale napsat: for(int i=2; i!=4; i++)
nebo take: for(int i=4; i!=2; i--)
hlubsi rozbor necham povolanejsim :)
(z toho mi vyplyva, ze univerzalni je pouzit != protoze se nespletu, oproti vyrazum < > kde zalezi na ++ nebo --)
jasně, že je někdy potřeba < > kdyz cislo neni přesné a je jen přibližné. apod.
-------
tak jsem to zkousel na stole a toto mi chodi.

Kód: Vybrat vše

#include <Adafruit_NeoPixel.h>
#define PIN            6  
Adafruit_NeoPixel strip = Adafruit_NeoPixel(4, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(9600);
   strip.begin();
   strip.show();

}

void loop() {
 
    //pásek napůl

    for(int i=0; i<2; i++) { 
         Serial.println(i); 
    strip.setPixelColor(i, 655360) ;
    strip.show();
    delay(500);}
    delay (2000);
    for(int i=2; i<4; i++) {
         Serial.println(i);  
    strip.setPixelColor(i, 655360) ;
    strip.show();
    delay(500);}
    delay (2000);
    for(int i=3; i>1; i--) {
         Serial.println(i);  
    strip.setPixelColor(i,0) ;
    strip.show();
    delay(500);}
 delay (2000);
    for(int i=1; i> -1; i--) { 
   Serial.println(i);
    strip.setPixelColor(i,0) ;
    strip.show();

    delay(500);}
    delay(1000);
  Serial.println("-----");
}
Naposledy upravil(a) Vladimir66 dne 23 lis 2018, 01:50, celkem upraveno 9 x.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek od daton »

Jo tak se zapornym čìslem jsem v cyklu ještě nepracoval zajimave :) dík za inspiraci
U for cyklu jsem pouze neveděl že nelze v podmínce požít rovnitko (==) a naopak že lze použít záporné číslo to se mi asi vrylo z picaxe tam to nejde. Dik
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Pomoc se výkladem kodu

Příspěvek od DavidO »

Néé, počkej, teď ses nechal úplně zmást. Ve for cyklu v podmínce vždycky piš ==. Ta podmínka ve for je podmínka jako kdekoli jinde. Akorát nedává smysl nastavit i=2 a pak nechat cyklus běžet, dokud platí i==4 protože to neplatí nikdy. Podobně jako ty ostatní příklady, co Vláďa napsal že "nemůžeš" (ve skutečnosti můžeš, ale nedává to smysl). Navíc je obvykle matoucí, jak to je s = a ==. = je přiřazení, == porovnání. Vždycky. Jenže z návrhu jazyka plyne, že tam, kde je podmínka, se dá napsat i přiřazovací příkaz (který má jen to jedno rovnítko), a pořád to z hlediska jazyka bude v pořádku - jen to nebude dělat to samé.

Ještě se omlouvám, včera jsem napsal nepřesnost: for cyklus jede tak, že se nejdřív vykoná inicializační příkaz (to první za závorkou), pak se vyhodnotí podmínka (druhé v závorce) a pokud je splněna, provede se tělo cyklu (příkaz nebo blok příkazů za závorkou) a pak se provede iterační příkaz (to třetí v závorce). A pak se znovu otestuje podmínka atd. atd. a když není splněna, tak se pokračuje dalším příkazem za cyklem. Tak jak jsem to popsal já, by se tělo cyklu provedlo aspoň jednou, i kdyby podmínka už dopředu nebyla splněna. To je dost divné, ale v nějakém jazyce to bylo, snad v nějakém BASICu, už jsem to roky neviděl.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Pomoc se výkladem kodu

Příspěvek od DavidO »

To se zápornými čísly v cyklech a s typy, které nemůžou obsahovat záporné číslo (např. uint16_t, kde to u na začátku znamená unsigned) je potřeba si rozmyslet. Když potřebuju začínat od 0, není to problém, když potřebuju nulou skončit, musí se to udělat šikovně. Když bych napsal for(uint16_t i=5;i>0;i--), tak se na vykonání těla s nulou nedostane (naposled se provede tělo s 1, pak se i zmenší o 1, už to nebude >0 a tedy se tělo už neprovede). Pokud bych napsal for(uint16_t i=5;i>=0;i--), tak se sice na nulu dostanu, ALE ta podmínka bude splněná vždycky, protože proměnná i je vždycky nezáporná ze své podstaty.
Řešení jsou dvě: buď v cyklu použít jako řídící proměnnou nějaký typ se znaménkem (třeba int, short int, long int), pak for(int i=5;i>=0;i--) i for(int i=5;i>-1;i--) bude fungovat tak, jak to na první pohled vypadá. Ale může to být v kontextu programu trochu matoucí. Anebo můžu použít jiný typ cyklu a tu podmínku patřičně upravit, například:

Kód: Vybrat vše

uint16_t i=6;
while (i>0)
{
  i--;
  strip.setPixelColor(i,0) ;
  strip.show();
  delay(500);
}
takže i sice na začátku nastavím na 6, ale v těle cyklu ho nejdřív zmenším, a pak s tím zmenšeným vykonám příkazy co potřebuju, a pak ostestuju tu podmínku znova. Tím pádem ten příkaz uvnitř provedu pro čísla 5, 4, 3, 2, 1, 0 a pak se zjistí, že i už není větší než 0 a tedy se skončí. Rozdíl oproti for cyklu je ten, že jsem si tady napsal sám, kdy se to i zmenšuje (na začátek těla), zatímco u for cyklu se to provede vždycky až po tom těle.
Obdobně by fungoval i cyklus

Kód: Vybrat vše

uint16_t i=6;
do {
  i--;
  strip.setPixelColor(i,0) ;
  strip.show();
  delay(500);
}while (i>0);
kdy se ta podmínka testuje po vykonání těla cyklu, ne před ním. To je dokonce o něco úspornější, protože v tomhle případě se podmínka bude vyhodnocovat 6x (poprvé se otestuje, když i je 5), zatímco s podmínkou na začátku 7x (poprvé pro 6, pak pro 5, atd. až pro 0).
(tedy ještě je otázka, co s tím provede kompilátor při optimalizaci, ale to jen na okraj)
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Odpovědět