Close

proměnný název proměnné

Úvodní stránka Fórum Software Jazyky Jazyk Wiring proměnný název proměnné

Aktuálně je na stránce zobrazeno 11 příspěvků - 1. až 11. (celkem z 11)
  • Autor
    Příspěvky
  • #11935
    pedyngro
    Účastník

    Zdravím,
    jsem začátečník a potřeboval bych pomoci s problémem, na který jsem narazil při pokusu napsat vlastní kód pro POV hůlku (něco jako tohle: http://www.instructables.com/id/Persistence-of-Vision-Wand/). Nejdřív jsem sestrojil funkční zařízení se třemi diodami, celý program se ale skládal většinou pouze z příkazů digitalWrite HIHG a LOW a delay. Protože bych chtěl přidat větší počet diod, rozhodl jsem se pro inteligentnější řešení, u kterého jsem ale narazil na neznalost programovacích jazyků.
    Program by měl fungovat následovně: for cyklus projíždí pole s nápisem, který chci zobrazit, if cykly, které v tomto for cyklu jsou, detekují jednotlivá písmena. Když zjistí, že aktuální písmeno je např. „o“, sputí funkci o:

    void o(){
    boolean dio1[] = {1,1,1};
    boolean dio2[] = {1,0,1};
    boolean dio3[] = {1,1,1};
    zobraz();

    Ta nastaví hodnoty určující, která dioda má kdy svítit, a spustí funkci zobraz:

    void zobraz(){
    for (int i = 0; i < 3; i++){ //pustí 1. sloupec, pak 2., pak 3.
    for (int j = 1; j <= 3; j++){ //pustí hodnotu aktuálního sloupce nejdřív v 1. řádku, pak v 2. a 3.
    if (dio’j'[i] == 1){ //pokud je hodnota 1, rozsvítí diodu
    digitalWrite(led’j‘,HIGH);
    }
    } //chvíli nechá rozsvíceno
    delay(znak);
    for (int k = 0; k < 3; k++){ //všechno zhasne
    digitalWrite(led’k‘,LOW);
    }
    delay(mezeraZnak); //chvíli nechá zhasnuto
    }
    delay(mezeraPismeno); //nechá zhasnuto (mezera mezi písmeny)
    }

    Problém je v tom, že neumím správně zapsat, jak se má měnit název proměnných led a dio v jednotlivých cyklech. Nevíte někdo, jak se to píše? Třeba v pythonu to zapsat jde. Nebo nedá se to celé vyřešit jinak (proto píšu, jak funguje celý projekt)?

    Díky za jakoukoli odpověď.

    #11937
    pedyngro
    Účastník

    chtěl jsem přiložit soubor s programem, ale nějak se to tu nezobrazuje…

    #11940
    Zbyšek Voda
    Správce

    Dobrý den, v C název proměnné nezměníte.
    Můžete ale udělat dvojrozměrné pole.

    Místo

    boolean dio1[] = {1,1,1};
    boolean dio2[] = {1,0,1};
    boolean dio3[] = {1,1,1};

    zapište

    boolean dio[3][3] = {{1,1,1}, {1,0,1}, {1,1,1}}

    a potom už můžete indexovat tak, jak jste to zamýšlel:
    třeba: dio[j][i]

    #11943
    pedyngro
    Účastník

    Díky, mělo by to fungovat, ale když nastavím např. ve funkci „a“ hodnoty pole „diody“, někde se to cestou ztratí:

    void a(){
    boolean diody[3][3] = {{1,1,1},{1,0,1},{1,1,1}};
    Serial.println(diody[0][0]);
    zobraz();

    void zobraz(){
    Serial.println(diody[0][0]);
    for (byte i = 0; i < 3; i++){
    atd…

    Když to nechám vyprintovat z té funkce, kde hodnoty nastavuji, je všechno v pořádku, ale v další funkci, která s hodnotami dále pracuje, už je všechno „0“.

    Nevíte, čím by to mohlo být?

    #11944
    Vojtěch Vosáhlo
    Účastník

    Pole musíte mít nadefinované mimo smyčku, třeba na začátku programu. Takhle s ním může pracovat jen smyčka ve které bylo pole „stvořené“.

    #11945
    pedyngro
    Účastník

    Pole mám definované na začátku programu (mimo setup a loop), zjistil jsem, že při printování z funkce „zobraz“ jsou tam hodnoty, které jsou zadané na začátku při vytvoření pole, ty další změny už to nebere v potaz…

    #11946
    Zbyšek Voda
    Správce

    Pošlete celý kód, takhle se nikam neposuneme.

    #11947
    pedyngro
    Účastník

    Pokusil jsem se ten soubor nahrát tlačítkem „procházet…“, ale nezobrazilo se to tu, takže jsem to vložil do odpovědi ctrl+c ctrl+v… Jinak moc díky za pomoc!

    [code]
    byte led1 = 8; //nastavení pinů pro jednotlivé diody
    byte led2 = 10;
    byte led3 = 12;

    boolean diody[3][3] = {{},{},{}};

    int znak = 20; //doba svícení
    int mezeraZnak = 10; //mezera mezi dvěma bliknutími v jednom písmenu
    int mezeraPismeno = 30; //mezera mezi písmeny

    char napis[] = „calex“;
    int delkaNapisu = sizeof(napis)/sizeof(napis[0]);

    void a(){
    boolean diody[3][3] = {{1,1,1},{1,0,1},{1,1,1}};
    zobraz();
    }

    void c(){
    boolean diody[3][3] = {{1,1,1},{1,0,0},{1,1,1}};
    zobraz();
    }

    void e(){
    boolean diody[3][3] = {{1,1,1},{1,1,0},{1,1,1}};
    zobraz();
    }

    void l(){
    boolean diody[3][3] = {{1,0,0},{1,0,0},{1,1,1}};
    zobraz();
    }

    void o(){
    boolean diody[3][3] = {{1,1,1},{1,0,1},{1,1,1}};
    zobraz();
    }

    void x(){
    boolean diody[3][3] = {{1,0,1},{0,1,0},{1,0,1}};
    zobraz();
    }

    void zobraz(){
    for (byte i = 0; i < 3; i++){ //postupně projíždí sloupce
    for (byte j = 0; j < 3; j++){ //projíždí hodnoty řádku v každém sloupci
    if (diody[i][j] == 1){ //pokud je hodnota 1, rozsvítí příslušnou diodu
    if (j == 0){
    digitalWrite(led1,HIGH);
    }
    if (j == 1){
    digitalWrite(led2,HIGH);
    }
    if (j == 2){
    digitalWrite(led3,HIGH);
    }
    }
    }
    delay(znak); //nechá chvíli rozsvíceno
    digitalWrite(led1,LOW); //všechno zhasne
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    delay(mezeraZnak); //nechá zhasnuto
    }
    delay(mezeraPismeno); //nechá zhasnuto – mezera mezi písmeny
    }

    void setup() {
    Serial.begin(9600);
    pinMode(led1,OUTPUT);
    pinMode(led2,OUTPUT);
    pinMode(led3,OUTPUT);
    }

    void loop() {
    for (int i = 0; i < delkaNapisu; i++){ //projíždí po jednom pole „nápis“
    if(napis[i] == ‚a‘){ //pokud je aktuální hodnota v poli „a“, pustí funkci „a“
    a();
    }
    if(napis[i] == ‚c‘){
    c();
    }
    if(napis[i] == ‚e‘){
    e();
    }
    if(napis[i] == ‚l‘){
    l();
    }
    if(napis[i] == ‚o‘){
    x();
    }
    if(napis[i] == ‚x‘){
    x();
    }
    }
    }
    [/code]

    #11958
    Zbyšek Voda
    Správce

    Je tam více problémů.

    Jeden problém je v tzv. scope – česky tuším rozsah platnosti proměnných.
    Na začátku si vytvoříte pole diody, které je globální – můžete k němu přistupovat ve všech funkcích. Potom si třeba ve funkci a vytvoříte pole diody, které je pro tuto funkci lokální. A tím zastíníte globální pole diody. Dále dojde k zavolání funkce zobraz(), ale ta nevidí to lokální pole z funkce a, ale globální pole diody definované na začátku.

    Kdyby se nejednalo o pole, stačilo by odebrat klíčové slovo boolean ve funkcích a pak už by se měnila hodnota globální proměnné. U pole to ale tak jednoduché není, protože nejde napsat ve funkci diody[3][3] = {{1,1,1},{1,0,1},{1,1,1}};.

    Napadají mě dvě cesty, jak to řešit.

    První možnost:
    Vytvoříte si několik globálních polí, která budou obsahovat požadované sekvence
    Třeba: boolean v1[3][3] = {{1,1,1},{1,0,1},{1,1,1}};
    a potom v jednotlivých funkcích překopírujete obsah požadovaného pole do pole diody.
    memcpy(diody, v1, 9 * sizeof(boolean));
    O memcopy viz zde: http://www.cplusplus.com/reference/cstring/memcpy/

    Druhá možnost:
    Funkci zobraz() přidáte parametr typu pole, přes který vždy předáte pole do funkce zobraz. To pak můžete nechat kód tak, jak máte (lokální pole v tomto případě nevadí), jen přidáte zavolání funkce s parametrem pole: zobraz(diody).
    Globální pole diody pak můžete zahodit. Tato cesta je asi schůdnější

    #11963
    pedyngro
    Účastník

    Moc díky, konečně to funguje, jak má! Už jsem se sám pokoušel nějakým způsobem předat hodnoty pole přes parametr funkce zobraz, ale nevěděl jsem jak. Asi sebudu muset líp naučit C a nespoléhat na to, že co jde v pythonu, jde všude…

    Ještě jednou moc děkuji za čas, který jste si na mě udělal, místo abyste mě odkázal na učebnici C.

    #11966
    Zbyšek Voda
    Správce

    Není zač, ať se daří. Jsem rád, že program funguje 🙂

Aktuálně je na stránce zobrazeno 11 příspěvků - 1. až 11. (celkem z 11)
  • Pro reakci na toto téma se musíte přihlásit.