NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Pointer na funkciu

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
vitaz
Člen
Avatar
vitaz:16.1.2018 21:22

Ahojte, potreboval by som pre Arduino napisat v c++ Triedu/Objekt, v ktorom sa spusti funkcia deklarovana v hlavnom sketchi. Nieco ako je delegat v C#. S C++ som uplny zaciatocnik potreboval by som pomoc?

 
Odpovědět
16.1.2018 21:22
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na vitaz
ostrozan:18.1.2018 8:52

Můžeš si vytvořit halavičkový soubor - třeba main.h , kde deklaruješ prototyp tvojí funkce a pak ho includuješ jak do hlavního sketche *.ino tak do tvojeho *.cpp souboru

Další možnost je tu funkci přesunout do té tvojí nové třídy

Doporučuju využít té druhé možnosti a v souboru *.ino (sketch) nechávat jen dvě základní funkce : setup() a loop(), případně nějaké pomocné, které budeš používat jen tam a nikde jinde

 
Nahoru Odpovědět
18.1.2018 8:52
Avatar
Nahoru Odpovědět
18.1.2018 9:46
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:18.1.2018 11:02

Ukazatel na funkci jsem mu ani nenabízel (i když si o něj víceméně řekl v titulku)- píše, že je "uplny zaciatocnik" - a ukazatele na funkci jsou přece jenom trochu "vyšší dívčí" - navíc by ho asi musel předávat jako parametr při volání nějaké funkce z té jeho třídy - a to asi úplně nechtěl.

Myslím,že ukazatel na funkci nepotřebuje - spíš upravit návrh.

 
Nahoru Odpovědět
18.1.2018 11:02
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na vitaz
ostrozan:18.1.2018 11:11

Nebo tu funkci deklaruj jako extern

v souboru *.ino

extern void FunkceZhlavnihoKodu()
{

.....

}

a v *.cpp souboru opět

extern void FunkceZhlavnihoKodu();

void MyClass::fce ()
{
        FunkceZhlavnihoKodu();
}
 
Nahoru Odpovědět
18.1.2018 11:11
Avatar
vitaz
Člen
Avatar
vitaz:18.1.2018 12:25

Dakujem, uz som to vyriesil. Potreboval som vyriesit nieco ako event na udalost. A kedze sa mi nechcelo predavat vsetky parametre danemu objektu tak som to vyriesil volanim funkcie odkazom. Funkcia je v hlavnom subore .ino a tym padom ma pristup k vsetkym potrebnym objektom, ktore potrebujem obsluzit.

Davam aj kod keby to niekto potreboval:

V ino subore:

void event(uint8_t offset){
// kod ktory potrebujes spustit a ma pristup k zdrojom v ino subore

}

void loop(){
MojaTrieda mojObjekt(&event);
// Spusti metodu event definovanu vyssie
mojObjekt.spust();
}

Hlavickovy subor:

class MojaTrieda
{
public:
// New type: pointer to function
using pFunction = void(*)(uint8_t offset);
//
MojaTrieda(pFun­ction event);
void spust();

private:
// adresa funkcie ktoru ma spustit
pFunction _event;

};

Cpp subor:

MojaTrieda::Mo­jaTrieda(pFun­ction event){
_event = event;
}

MojaTrieda::spus­t(uint8_t offset){
_event(uint8_t offset);
}

 
Nahoru Odpovědět
18.1.2018 12:25
Avatar
ostrozan
Tvůrce
Avatar
ostrozan:19.1.2018 9:42

To myslíš vážně ?!

void event(uint8_t offset){
// kod ktory potrebujes spustit a ma pristup k zdrojom v ino subore

}

void loop(){
MojaTrieda mojObjekt(&event);
// Spusti metodu event definovanu vyssie
mojObjekt.spust();
}

což je to samé jako

void event(uint8_t offset){
// kod ktory potrebujes spustit a ma pristup k zdrojom v ino subore

}

void loop(){
event(offset);
...
...
}

já myslel, že chceš používat funkci z hlavního kódu v nějaké třídě nezávisle na hlavním kódu
tvůj způsob řešení předáním ukazatele na funkci je sice jedním z možných ale v tomto případě nejméně vhodný - protože zatěžuje paměť - všechny proměnné (tedy i ukazatele) jsou v RAM, které nemá Atmega v Arduinu na rozdávání - je to jen pár kilo (u Arduino Mega 8kB, u Arduino Uno dokonce jen 2kB) - což si málokdo uvědomuje, a ta ti dojde dřív, než by ses nadál - moje zkušenost je, že když ti kompilátor zahlásí využití RAM na 90% , tak ti program určitě dřív, nebo později zkolabuje

tu samou službu ti poskytne ten extern - což je záležitost kompilátoru a na paměti se ti nijak neprojeví

 
Nahoru Odpovědět
19.1.2018 9:42
Avatar
vitaz
Člen
Avatar
Odpovídá na ostrozan
vitaz:21.1.2018 18:38

Samozrejme, ze ten kod nebude taky jednoduchy. Na tom arduine mam kopec cidiel, displej, klavesnicu a pod. Takze to na co som sa pytal ma svoj zmysel. Tak poprosim nehejtovat, bez znalosti suvislosti.

 
Nahoru Odpovědět
21.1.2018 18:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.