volání funkce pomocí pole
Úvodní stránka › Fórum › Vaše projekty › Arduino › volání funkce pomocí pole
Označeno štítky: volání funkce
- Toto téma obsahuje celkem 1 odpověď. Do diskuze (2 diskutující) se naposledy zapojil uživatel Zbyšek Voda a poslední změna proběhla před 9 roky.
-
AutorPříspěvky
-
15.12.2015 v 19:58 #5485theloniusÚč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čítkavoid 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 scrXmenu[totoMenu](); // ide vyhodí chybovou hlášku
}
//———————————————————–
void scr1(){
digitalWrite((LEDzl), !digitalRead(LEDzl));
delay(30);
}void scr2(){
digitalWrite((LEDze), !digitalRead(LEDze));
delay(30);
}
//————————————————————————-[/code]
15.12.2015 v 20:32 #5488Zbyšek VodaÚčastníkDobrý 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 🙂
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.