Close

Jak na název s automatickým posunem jména

Úvodní stránka Fórum Hardware Arduino Jak na název s automatickým posunem jména

Aktuálně je na stránce zobrazeno 5 příspěvků - 1. až 5. (celkem z 5)
  • Autor
    Příspěvky
  • #7388
    Profilový obrázekBorgMcz
    Účastník

    Potřeboval bych v jednom projektu v následujícím kódu měnit v posloupnosti jméno :
    RBD::Button jméno (pin);
    toto je zakladní vytvoření funkce, mohu ji tvořit ručně:

    RBD::Button button0(30);  RBD::Button button1(31); RBD::Button button2(32);

    ale potřeboval bych to tvořit automaticky za pomoci cyklu, něco jako asi takhle:

    for (int x=0; x<15; x++) {   RBD::Button button(x)(y);   }

    nevím, jak správně to zapsat, aby IDE pochopilo co chci. Dá se to nějak zapsat?
    Jde mi pouze o to jméno plus cislo v X , Y je jasne.

    #7390
    Zbyšek VodaZbyšek Voda
    Správce

    Dobrý den, pošlu vám celý kód určený pro LEDky ze článku.

    class LED{     private:          int pin;         boolean stav = LOW; //výchozí stav LED je vypnuto         void nastav(boolean);      public:          LED(int);         void zapni();         void vypni();         void prepni();         boolean vratStav(); };  LED::LED(int p){     pin = p;     pinMode(pin, OUTPUT);     digitalWrite(pin, stav); }  void LED::zapni(){     nastav(HIGH); }  void LED::vypni(){     nastav(LOW);     }  void LED::prepni(){     nastav(!stav); //nastaví LED na obrácenou hodnotu (0->1, 1->0) }  void LED::nastav(boolean s){     stav = s;     Serial.print("Nastavuji ");     Serial.print(stav);     Serial.print(" na pinu ");     Serial.println(pin);     digitalWrite(pin, stav); }  boolean LED::vratStav(){     return stav;      }  #define NO_OBJECTS 6  LED *LEDS = (LED*)malloc(NO_OBJECTS * sizeof(LED));  void setup() {     Serial.begin(9600);          for(int i = 0; i < NO_OBJECTS; i++){         LEDS[i] = LED(i);     }         for(int i = 0; i <= 10; i++){         LEDS[2].prepni();         delay(500);         } }  void loop() { }

    Důležité části jsou:

    #define NO_OBJECTS 6
    Řekne programu, že bude celkem 6 LEDEK/TLAČÍTEK…

    LED *LEDS = (LED*)malloc(NO_OBJECTS * sizeof(LED));
    Vytvoří se ukazatel na datový typ LED. Funkce malloc alokuje v paměti prostor pro budoucí pole – potřebuje vědět, jak bude velké. Proto se jí jako parametr předá velikost jednoho objektu LED (sizeof) ponásobená počtem objektů v poli. Funkce malloc vrací datový typ void*, takže je potřeba ho ještě před uložením do LEDS přetypovat na LED*. Dále už se dá s LEDS pracovat jako s normálním polem.

    Nevím, jestli je toto nejjednodušší cesta, ale nenapadla mě jednodušší.

        for(int i = 0; i < NO_OBJECTS; i++){         LEDS[i] = LED(i);     }

    Do pole LEDS poukládá objekty LED na daných pinech.

       for(int i = 0; i <= 10; i++){         LEDS[2].prepni();         delay(500);         }

    Postupně bliká ledkami.

    Snad to je pochopitelné. Kód by měl jednoduše jít předělat pro vaše potřeby. Pole by mohlo vypadat takto:

    RBD::Button *pole = (RBD::Button*)malloc(NO_OBJECTS * sizeof(RBD::Button));

    Jeho naplnění potom:

    for(...){     pole[i] = RBD::Button(i); }
    #7402
    Profilový obrázekposjirka
    Účastník

    souhlasím se Zbyškem. Asi jedinou variantou je udělat pole objektu (nikoliv proměnných …), které se nadefinuje jako rozěmr pole a poté se pro každý záznam/buňku pole vytvoří instance objektu. Vcelku hezká diskuze a vysvětlení je třeba tu:
    https://forum.arduino.cc/index.php?topic=80913.0

    Zbyšek to napsal velmi správně jen je to v tom textu těžko čitelné.
    v podstatě tě zajímá pouze tato část:

    int BUTTON[] = {2,3,4,5,6};  //button pins const int numButtons = 5;   Bounce bouncer[5];  for( int i = 0; i < numButtons; i++){    Bounce bouncer[i] = (BUTTON[i], 5); }

    Jinak doporučuju použít standardní řadu proměnných, už jen z důvodu omezené kapacity paměti RAM. Například v C# bych si toto dovolil a použil spíš kolekci než pole pro lepší manipulaci se záznamy. V poli musíš nadefinovat jak bude veliké a v případě zmany velikosti provést „přenesní hodnot“. s kolekcí můžeš dělat co chceš. Je však náročná na paměť a Arduino jinepodporuje. Chci tím říst, že stejně na začátku budeš muset nadefinovat kolik těch objektů budeš chtít vytvořt a ověřit si že máš dostatek volných prostředků. Navíc se budeš odkazovat na objekty jako na realtivní adresy, … Prostě mi to trochu v hlavě nabourává tu jednoduchost řešení případů, pro kterou bylo arduino navrženo…. tyto procesy bych spíš řešil na raspberry pi.

    #7406
    Profilový obrázekBorgMcz
    Účastník

    No zkoušel jsem co se dalo, ale výsledek mám stále s nějakou chybou.
    Nemohl bych to poslat s mailem, kde bych vyznačil problémová místa.
    můj mail mm.svet(za.vi.nac)centrum.cz

    opravdu díky za pomoc

    #7407
    Zbyšek VodaZbyšek Voda
    Správce

    To vytvoření pole přes
    Bounce bouncer[5];

    jsem také zkoušel, ale nějak to kompilátor nebral. Přitom by to takto mělo C++ podporovat.
    Proto jsem šel tou cestou přes malloc().

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