Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 1 sty 2025, o 07:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 6 wrz 2016, o 00:29 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 61
Pomógł: 0

Witam :)
Szanowni koledzy, mam taką zagwozdkę. Czy możliwe jest napisanie funkcji(bloku) który później w programie byłby wykorzystywany tak jak instrukcja warunkowa if. Dla lepszego zobrazowani posłużę się prościutkim przykładem jak miałoby to wyglądać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Chodzi mi o to, żeby do wcześniej utworzonej funkcji móc zalinkować instrukcję znajdujące się między klamrami i wykonywać je w zależności od podanych argumentów - bardzo zbliżone do if;ów czy jakichkolwiek pętli ale stanowiące własną funkcję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2016, o 06:06 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 181
Lokalizacja: Kraków
Pomógł: 30

Nie dokońca rozumiem czy o to chodzi, ale jest taka instrukcja switch(argument), która w zależności od wartości argumentu może wykonywać różne sekwencje programu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2016, o 09:33 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Jeśli chodzi Ci o to, że masz jakiś skomplikowany warunek, który zmniejsza czytelność kodu i chciałbyś zastąpić go funkcją, to można zrobić coś w stylu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Oczywiście isEqual() to tylko przykładowa, prosta funkcja. W rzeczywistości można w niej wykonać dowolne obliczenia i sprawdzić dowolną ilość warunków.

Jeśli nadal przeszkadza Ci słowo kluczowe if, można dodatkowo użyć makra preprocesora:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


tylko moim zdaniem to pogorszy zrozumiałość kodu, a nie bardzo rozumiem, czemu miałoby to służyć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2016, o 14:59 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

Kolego Jatsekku rozwiń swoją myśl, bo obecnie to bardzo ciężko przychodzi mi zrozumienie twojego problemu. Chcesz w jednej funkcji wykonywać inne funkcje w zależności od argumentów wejściowych? Czy chcesz też wywoływać różne funkcje na argumentach przekazanych do tej funkcji?

Kolego andrews, to co podałeś, to przykłady, jak nie programować. Nie dość, że funkcja isEqual niczego nie upraszcza, to jeszcze ukrywa sposób w jaki te argumenty są porównywane. W dodatku przypomina mi to:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
A pomysł z tym makrem? To dopiero zaciemnienie kodu. Jest podatne na błędy, a patrząc na kod w ogóle nie wiadomo, o co chodzi, jeśli się wcześniej tego makra nie widziało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2016, o 16:08 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Sparrow-hawk napisał(a):
funkcja isEqual niczego nie upraszcza
Napisałem wyraźnie, że to tylko przykład, aby pokazać, w jaki sposób użyć funkcji jako warunku (bo tak zrozumiałem pytanie). To, czy ta funkcja ma sens jest bez znaczenia, ponieważ zakładałem, że autor wątku sam sobie napisze funkcję, która robi coś sensownego.

Sparrow-hawk napisał(a):
Kolego andrews, to co podałeś, to przykłady, jak nie programować ... funkcja isEqual ... ukrywa sposób w jaki te argumenty są porównywane
Zgodnie z tą tezą wszystkie funkcje biblioteki standardowej ctype.h (isalpha() isdigit() itp.) są przykładem, jak nie programować, bo one też ukrywają...

Sparrow-hawk napisał(a):
A pomysł z tym makrem? To dopiero zaciemnienie kodu.
Pokazałem tylko w jaki sposób osiągnąć dokładnie taki efekt, jakiego oczekiwał autor wątku (patrz pierwszy post), nie napisałem, że to dobry sposób. Przeczytałeś w ogóle to, co napisałem po tym przykładzie, czy żądza krytyki już Ci nie pozwoliła?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2016, o 16:23 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27322
Lokalizacja: Szczecin
Pomógł: 1041

Sparrow-hawk napisał(a):
Kolego andrews, to co podałeś, to przykłady, jak nie programować

Panie kolego zanim napiszesz takie (przepraszam) bzdury - to proszę cię przemyśl co i jak piszesz na forum ok ? na TYM forum.

1. Jak na razie NIKT nie rozumie o co chodzi autorowi wątku - ja też nie dlatego nie wypowiadam się gdy nie rozumiem pytania.

2. Ok są życzliwi ludzie, którzy chcą pomóc i próbując zgadnąć o co chodziło autorowi wątku podpowiadają jakieś sposoby - a nóż któryś trafi do autora

3. kolega andrews napisał wyraźnie
andrews napisał(a):
to można zrobić coś w stylu:

i dalej:
andrews napisał(a):
Oczywiście isEqual() to tylko przykładowa, prosta funkcja. W rzeczywistości można w niej wykonać dowolne obliczenia i sprawdzić dowolną ilość warunków.


natomiast na temat proponowanego makra andrews napisał wyraźnie
andrews napisał(a):
tylko moim zdaniem to pogorszy zrozumiałość kodu, a nie bardzo rozumiem, czemu miałoby to służyć.


więc proszę cię - nie czepiaj się - tylko jeśli już chcesz coś podpowiedzieć to podpowiedz, pokaż rozwiązania które ty proponujesz , ew odnieś się do jakichś ewidentnych błędów gdyby ktoś wcześniej podczas swojej odpowiedzi takie popełnił - pokazując jak wg ciebie należałoby to rozwiązać

bo dzięki temu WSZYSCY skorzystają i pytający i odpowiadający itp itd .... Tymczasem jak pisałem wyżej - kolega andrews jasno określił o co chodzi i jakie to niesie konsekwencje - ale główny cel to było sprowokowanie autora wątku do myślenia i uzupełnienia swojego pytania.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2016, o 20:56 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 61
Pomógł: 0

Załóżmy, że jako argumenty przekazuje sobie np priorytet zadania, i jego maksymalny czas wykonywania. I funkcja ta wywołuje się cyklicznie wtedy kiedy nastąpi jej kolej, z tym, że nie chcę by była to zwykła funkcja tylko właśnie taki "przełącznik" który realizuje mi to co jest w klamrach w zależności od argumentów i np zmienny globalnych jakim w tym wypadku mógłby być timer programowy. Wiem, że może nie opisuje problemu zbyt dokładnie ale nie wiem jak to najlepiej ubrać w słowa. Może pomogłaby analiza działania samego bloku warunkowego if od wewnątrz. Może nakieruje mnie ktoś gdzie mogę ją podejrzeć?
Najistotniejsze są dla mnie te klamerki - funkcja realizujące instrukcje zawarte w klamrach



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2016, o 22:24 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

Ja dalej nie rozumiem o co chodzi, m.in. z priorytetem zadania, w avr wszystko wykonuje się po kolei.
Klamerki możesz sobie wstawić gdzie chcesz, pytanie tylko po co, jedni piszą IF z pojedynczą instrukcją jako blok z klamrami, inni bez, osobiście preferuje klamry, ale to kwestia przyzwyczajenia, a może zboczenie poprawiające czytelność zwłaszcza przy długich kodach.
Może wrzuć w postaci kodu co masz zamiar osiągnąć, będzie łatwiej coś wymyślić.

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2016, o 07:13 
Offline
Użytkownik

Dołączył(a): 26 lut 2014
Posty: 288
Lokalizacja: Gdańsk
Pomógł: 13

Albo narysuj jakiś algorytm/ schemat działania programu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2016, o 08:04 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

Myślę, że koledze chodzi o stworzenie takiego Multi-tasking, z kolejką funkcji, zdefiniowanym przydziałem czasu na wykonanie każdej z nich i ich priorytetem. Taka wielozadaniowość, lub coś na wzór prostego RTOS'a.

Tutaj znalazłem artykuł w języku angielskim: http://www.avrfreaks.net/forum/tutc-multi-tasking-tutorial-part-1?page=all



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2016, o 21:09 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

Być może, ale nawet takie coś trzeba zrozumieć przed implementacją, zwłaszcza jeśli to ma być niezawodne.
Idea jest prosta, ale tylko dla kogoś kto tworzył aplikacje jednowątkowe z przymusu ;)

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 wrz 2016, o 23:26 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 61
Pomógł: 0

Okey, już sobie jakoś poradziłem bez tego. Dziękuję bardzo wszystkim za odpowiedzi.
Temat do zamknięcia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO