Diskuze: Pointer na funkciu
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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
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.
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();
}
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(pFunction event);
void spust();
private:
// adresa funkcie ktoru ma spustit
pFunction _event;
};
Cpp subor:
MojaTrieda::MojaTrieda(pFunction event){
_event = event;
}
MojaTrieda::spust(uint8_t offset){
_event(uint8_t offset);
}
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í
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.
Zobrazeno 8 zpráv z 8.