Na desktopie piszę tak i mi działa (inb4 stdio.h w C++, nie ma to znaczenia dla przykładu)
#include template void handler(void) { printf("handler %d\n", p); } void call(void (*f)(void)) { f(); } int main() { call(handler<8>); return 0; } Na ESP32 w Arduino (inb4 pisanie w arduino - projekt już w tym jest napisany, nie zależy to ode mnie) dostaję
error: no matches converting function 'ButtonInterruptHandler' to type 'void (*)()' attachInterrupt(pin, ButtonInterruptHandler, FALLING); note: candidate is: template void ButtonInterruptHandler() void ButtonInterruptHandler(void) Może jest jakiś lepszy sposób? Muszę wiedzieć z którego pinu idzie przerwanie.
@zwei: jakiś przedpotopowy kompilator? (po błędach wygląda jak gcc ale może jakaś wersja z XIX wieku albo opcji typu -std=c++11 mu brakuje). na moje oko powinno działać, ale jak chcesz handler a nie doktoryzować się czemu nie robi, to może po prostu:
void handler8() { handler<8>(); } itp. dla poszczególnych pinów. jak ich masz 100, to
#define PIN_HANDLER(pin) void handler ## pin() { handler(); } (sklejanie tokenów przez ## nie do
@zwei: podobno preprocessor arduino psuł te deklaracje jeśli nie były w jednej linii i to wystarczało żeby to naprawić. a nie masz czasem wyboru w IDE którego standardu c++ chcesz użyć? już nie pamiętam czy była taka opcja
@zwei: Arudino avr kompiluje z avr-g++ gdzie chyba obecnie działa coś jak c++11. (mogę się mylić). Ale to na 100% kompilator C++. Arduino due wywołuje gcc, to znaczy projekt jest kompilowany jak projekt w C (99?). (Due ma cortexa m3). Podejrzewam więc, że esp32 na arduino ide śmiga w C. Ale to tylko takie moje nocne widzimisię.
Właśnie przyjechał do mnie znajomy z Polski, a że piątek, to otworzyliśmy wino. Potem jedziemy na strzelnicę jego autem. Pozdrowienia z #emigracja Trzymajcie się tam jakoś w tej Polsce!
Na desktopie piszę tak i mi działa (inb4 stdio.h w C++, nie ma to znaczenia dla przykładu)
#include
template
void handler(void)
{
printf("handler %d\n", p);
}
void call(void (*f)(void))
{
f();
}
int main()
{
call(handler<8>);
return 0;
}
Na ESP32 w Arduino (inb4 pisanie w arduino - projekt już w tym jest napisany, nie zależy to ode mnie) dostaję
error: no matches converting function 'ButtonInterruptHandler' to type 'void (*)()'
attachInterrupt(pin, ButtonInterruptHandler, FALLING);
note: candidate is: template void ButtonInterruptHandler()
void ButtonInterruptHandler(void)
Może jest jakiś lepszy sposób? Muszę wiedzieć z którego pinu idzie przerwanie.
edit: a źle spojrzałem xD
-std=c++11
mu brakuje). na moje oko powinno działać, ale jak chcesz handler a nie doktoryzować się czemu nie robi, to może po prostu:void handler8() {
handler<8>();
}
itp. dla poszczególnych pinów. jak ich masz 100, to
#define PIN_HANDLER(pin) void handler ## pin() { handler(); }
(sklejanie tokenów przez ## nie do
@wsciekly_buddysta: generalnie tego właśnie chciałem uniknąć
Makr nie znoszę, ale wygląda to sensownie
Arduino due wywołuje gcc, to znaczy projekt jest kompilowany jak projekt w C (99?). (Due ma cortexa m3). Podejrzewam więc, że esp32 na arduino ide śmiga w C. Ale to tylko takie moje nocne widzimisię.
Zresztą to jest problem, o którym powiedział @MamCieNaHita Jak podam stałą, to się kompiluje i działa :<