Close

volání funkce pomocí pole

Úvodní stránka Fórum Vaše projekty Arduino volání funkce pomocí pole

Označeno štítky: 

Aktuálně jsou na stránce zobrazeny 2 příspěvky - 1. až 2. (celkem z 2)
  • Autor
    Příspěvky
  • #5485
    thelonius
    Účastník

    Ahoj, nevim, jestli to mam hodit do koše nebo doufat, jestli se nekomu podaří mi vysvětlit „jak na to“. Myšlenka spočívá v tom že každá OBRAZOVKA (část menu) na display bude napsaná ve vlastní funkci s číslem o kolikátou funkci/obrazovku se jedná. pokud má proměnná např. hodnotu 1 jsem na první obrazovce. nedaří se mi ale funkce zavolat příkazem menu[totoMenu] což po sériové lince v pohodě vypíše scr1, ale při volání funkce to nejde. pokud máte nějakej typ jak na to, budu mýt druhý vánoce. díky

    [code]
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12,11,5,4,3,2);

    int th=0;
    int tm=0;
    int ts=0;
    int mark;

    int TLA1=6;
     int valTLA1;
     int TLA1pred;
    int TLA2=7;
     int valTLA2;
     int TLA2pred;
    int TLA3=8;
     int valTLA3;
     int TLA3pred;

    int LEDzl=9;
    int LEDze=10;
    int LEDce=13;
    bool LEDceVAL;

    int POT1=A0;
     int valPOT1;
    int POT2=A1;
     int valPOT2;

    int totoMenu=0;

    char* menu[]={„scr1“, „scr2“, „scr3“, „scr4“};

    int PRODLEVA=50; //doba po kterou program po stisknutí tlačítka ignoruje další změny stisků
    unsigned long CASZMENY; //časová značka (uloží millis, pro porovnání délky stisku tlačítka

    void setup() { //—————-setup—————————–
      pinMode(TLA1, INPUT);
      pinMode(TLA2, INPUT);
      pinMode(TLA3, INPUT);

      pinMode(LEDzl, OUTPUT);
      pinMode(LEDze, OUTPUT);
      pinMode(LEDce, OUTPUT);
      
      Serial.begin(9600);
      lcd.begin(16,2);
      lcd.setCursor(0,0);
      lcd.print(„ABCDEFGHIJKLMNOP“);
      lcd.setCursor(0,1);
      lcd.print(„KLMNOPQRSTUVWXYZ“);
      delay(1200);
      lcd.clear();

    }

    void loop() { //—————-loop———————————
    delay(15);

      if(mark<millis()/1000){
        mark++;
        ts++;  
        }
      
      if (tm==60){
        tm=0;
        th++;
        }
      
      if (ts==60){
        ts=0;
        tm++;
        }

      lcd.clear();
      lcd.setCursor(0,0);
      if (th<10){
        lcd.print(„0“);
        }
      lcd.print(th);
      lcd.print(„:“);
      lcd.setCursor(3,0);
      lcd.print(“ „);
      lcd.setCursor(3,0);
      if (tm<10){
        lcd.print(„0“);
        }
      lcd.print(tm);
      lcd.print(„:“);
      lcd.setCursor(6,0);
      lcd.print(“ „);
      lcd.setCursor(6,0);
      if (ts<10){
        lcd.print(„0“);
        }
      lcd.print(ts);

    if (digitalRead(TLA1)){
        if (TLA1pred==1 && millis()-CASZMENY>PRODLEVA){
          TLA1pred=0;
          digitalWrite(LEDzl, !digitalRead(LEDzl));
          totoMenu++;
          if (totoMenu>3){
            totoMenu=0;
            }   
          }
        }
        
        
    else{
          CASZMENY=millis();
          TLA1pred=1;
          TLA2pred=1;
          TLA3pred=1;
        }
        
    Serial.println(menu[totoMenu]); // program vypíše scrX

      menu[totoMenu](); // ide vyhodí chybovou hlášku
     
    }
    //———————————————————–
    void scr1(){
    digitalWrite((LEDzl), !digitalRead(LEDzl));
    delay(30);
    }

    void scr2(){
    digitalWrite((LEDze), !digitalRead(LEDze));
    delay(30);
    }
    //————————————————————————-

    [/code]

    #5488
    Zbyšek Voda
    Správce

    Dobrý den,
    to do čeho se pouštíte už je trochu obtížnější. Nějak by to ale jít mělo.
    Zkuste použít postup pomocí ukazatelů na funkce: http://physics.ujep.cz/~mmaly/vyuka/oporaPrgB/032.html. Tyto ukazatele si pak nastrkejte do pole menu.

    Problém použití funkce jako argumentu jiné funkce řeší třeba zde: http://stackoverflow.com/questions/1789807/function-pointer-as-an-argument

    Snad by šlo použít něco jako:

    
    void scr1(){
        digitalWrite((LEDzl), !digitalRead(LEDzl));
        delay(30);
    }
    ...
    void **menu = {&scr1, ...};
    
    void showMenu(void (*a)()){
        a();
    }
    
    showMenu(menu[0]);
    

    Zkuste a uvidíme 🙂

Aktuálně jsou na stránce zobrazeny 2 příspěvky - 1. až 2. (celkem z 2)
  • Pro reakci na toto téma se musíte přihlásit.