Skocz do zawartości
Wiadomość dodana przez Treker,

Uwaga od redakcji!

Pamiętaj, że w dziale "Artykuły użytkowników" pojawiają się wpisy, które napisali czytelnicy Forbota. Każdy może opublikować tutaj swój poradnik (również Ty). Nie oceniamy i nie weryfikujemy tych treści przed publikacją - szczególnie, gdy dotyczą tematów związanych np. z prawem lub medycyną. Jeśli widzisz błąd merytoryczny to zgłoś go w komentarzach - kulturalna i merytoryczna krytyka jest zawsze mile widziana. Pamiętaj jednak o Polityce Przyjaznego Forum.

Pomocna odpowiedź

38 minut temu, _LM_ napisał:

lepiej wyniki wpisać w tablicę dwuwymiarową

No, ale tu chodzi o wykonanie akcji zależnej od wyniku, a to już nie jest takie proste. Owszem, możemy sobie zastosować tablicę funkcji, ale przy stosunkowo niewielkiej ilości przypadków w instrukcji switch nie robi to wielkiej różnicy (w przypadku Arduino każdy case to dwie instrukcje maszynowe). I może okazać się, że switch/case będzie szybszy niż zabawa z wywołaniem funkcji i powrotem.

 

Dnia 6.04.2021 o 19:50, Mati294 napisał:

Jeżeli już uświadomimy sobie że to bardziej skomplikowany projekt z zależnościami czasowymi musimy zapomnieć o używaniu delay(); na rzecz millis();

No, to baaaaaardzo duże uproszczenie.

Zawsze twierdziłem, że są trzy stopnie wtajemniczenia: na początku używa się delay(), potem rezygnuje się z delay() i używa millis(), a na końcu używa się tego co w danym miejscu jest właściwe 🙂

 

(edytowany)

Żeby nie być gołosłownym 😉 zakładam że FINGERPRINT_OK czy FINGERPRINT_IMAGEMESS.... itd są poukładane w kolejności o 0 wzwyż wtedy twój program mógłby wyglądać:

const char s1[] = "Str1"; // tab komunikatow
const char s2[] = "Str2";
const char s3[] = "Str3";

const char * const pStr[] = {s1,s2,s3}; // tab wskaznikow do komunikatow

p = finger.fingerFastSearch();
Serial.prinlnt(pStr[p]);
return p;

Gdyby polecenia nie były w kolejności należy je przemapować na indeksy znajdujące się w tablicy wskaźników tak samo należy zabepieczyć się przed wyjściem poza tę tablicę

Edytowano przez _LM_
(edytowany)
9 minut temu, ethanak napisał:

No, ale tu chodzi o wykonanie akcji zależnej od wyniku, a to już nie jest takie proste. Owszem, możemy sobie zastosować tablicę funkcji, ale przy stosunkowo niewielkiej ilości przypadków w instrukcji switch nie robi to wielkiej różnicy (w przypadku Arduino każdy case to dwie instrukcje maszynowe). I może okazać się, że switch/case będzie szybszy niż zabawa z wywołaniem funkcji i powrotem.

Owszem trzeba pilnować wskaźników i innych rzeczy aby nie wyszły poza rozmiar tablicy itd. Jednak przy wielu możliwościach wyboru rozwiązanie z tablicami wydaje się być bardziej przejrzyste. A jak już do wskaźników na napis masz dołożony wskaźnik na funkcję (oczywiście jeśli zachodzi taka potrzeba) to już w ogóle wypas 🙂 A czy różni się to wydajnościowo? hmmm przy większych programach na pewno. Poza tym zauważ że w załączonym przeze mnie pseudokodzie wykonuję tylko raz funkcję print co zaś przełoży się na rozmiar kodu.

Skoro post kolegi @Mati294 dotyczy pisania wydajnych programów sądzę iż zasadne jest pokazanie innych technik programowania

Edytowano przez _LM_
23 minuty temu, _LM_ napisał:

wtedy twój program mógłby wyglądać:

Strasznie komplikujesz prostą sprawę.

A nie można po prostu:

const char * const pStr[]={"Str1", "Str2", "Str3"};

zamiast tworzenia niepotrzebnych zupełnie bytów, jak s1 i tak dalej? Takie konstrukcje są dobre jeśli używasz PROGMEM, ale wtedy masz kolejny galimatias z wydłubywaniem stringów z flasha i kombinowaniem, jak by tu je wypisać. Tam, gdzie sekcja stałych we flashu jest mapowana bezpośrednio do przestrzeni adresowej (np. ESP) wystarczy deklaracja const.

 

(edytowany)
30 minut temu, ethanak napisał:

Strasznie komplikujesz prostą sprawę.

A nie można po prostu:





const char * const pStr[]={"Str1", "Str2", "Str3"};

 

Co kto lubi 🙂 Powiedzmy że jest to kwestia nawyków i przyzwyczajeń, jako zaletę "mojego" rozwiązania mogę wymienić to że tworząc bardziej rozbudowane struktury, nie muszę liczyć pod którym indeksem znajduje się dany napis, a za to mogę odwołać się poprzez skróconą nazwę - wskaźnik. Oczywiście nie upieram się który zapis jest lepszy wszystko zależy co w danym momencie robimy

Edytowano przez _LM_

Zacznę od tego że nie spodziewałem się takiego odzewu a teraz po kolei.

1 godzinę temu, ethanak napisał:

I może okazać się, że switch/case będzie szybszy niż zabawa z wywołaniem funkcji i powrotem.

Moim zdaniem instrukcja switch jest dużo bardziej czytelna a do przeważnie nie trzeba się zastanawiać co dana funkcja robi. W razie czego też zawsze można wyrzucić całość do innej karty. Wydaje się być też prostsza w debagu.

1 godzinę temu, ethanak napisał:

No, to baaaaaardzo duże uproszczenie.

Zawsze twierdziłem, że są trzy stopnie wtajemniczenia: na początku używa się delay(), potem rezygnuje się z delay() i używa millis(), a na końcu używa się tego co w danym miejscu jest właściwe

Tak w pełni się z tym zgadzam jednak z delay() (moim zdaniem) jest jak z goto bez prawdziwej potrzeby lepiej nie używać. Co do uproszczenia to wolałem je zastosować tak żeby początkujący mogli z tego skorzystać.

 

1 godzinę temu, _LM_ napisał:

A czy różni się to wydajnościowo? hmmm przy większych programach na pewno.

Przy większych programach (przynajmniej u mnie) większy problem stanowi wydajność a co do rozmiaru kodu no to niestety coś za coś.

Co do reszty jeżeli chodzi o fingerprint to aktualnie powstaje duuuużo bardziej zaawansowana wersja tego projektu gdzie sam czujnik i jego oprogramowanie stanowi tylko drobną cześć całości. Za jakiś czas powinien pojawić się osobny post dotyczącego tego projektu.

 

33 minuty temu, Mati294 napisał:

Przy większych programach (przynajmniej u mnie) większy problem stanowi wydajność

Zatem chyba najwyższy czas poznać funkcje zwrotne wraz z timerami programowymi i przydzielaniem zadań. Nawet na małym AVR można zbudować aplikacje "wielowątkowe"

3 minuty temu, _LM_ napisał:

Zatem chyba najwyższy czas poznać funkcje zwrotne wraz z timerami programowymi i przydzielaniem zadań. Nawet na małym AVR można zbudować aplikacje "wielowątkowe"

U mnie w większości odpowiada za to biblioteka do obsługi ekranu dotykowego jednak prędzej czy później będę musiał się tym zająć. Można prosić jakiś link do strony o tym z wykorzystaniem arduino?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...