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
- Toto téma obsahuje celkem 4 odpovědi. Do diskuze (3 diskutující) se naposledy zapojil uživatel Zbyšek Voda a poslední změna proběhla před 8 roky a 3 měsíci.
-
AutorPříspěvky
-
19.6.2016 v 22:02 #7388BorgMczÚč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.21.6.2016 v 12:41 #7390Zbyšek VodaSprávceDobrý 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); }
21.6.2016 v 23:06 #7402posjirkaÚčastníksouhlasí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.0Zbyš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.
22.6.2016 v 6:48 #7406BorgMczÚčastníkNo 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.czopravdu díky za pomoc
22.6.2016 v 13:01 #7407Zbyšek VodaSprávceTo 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(). -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.