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



Teraz jest 20 lut 2026, o 22:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 19 gru 2016, o 11:40 
Offline
Użytkownik

Dołączył(a): 31 lip 2016
Posty: 154
Pomógł: 4

Witam.
Modulo % reszta z dzielenia. W książce BB są przykłady np:

10%7=3
5%3=2
I to jest jasne.

Natomiast w poradniku wideo o modulo jest np:

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


Więc według mego rozumowania to:

mstick z pierwszego przykładu powinien zliczyć do 800 aby reszta była 200
mstick z drugiego przykładu powinien zliczyć do 1100 aby reszta była 500

Natomiast Mirek mstick zeruje przy wartości >599.
Gdzie popełniam błąd przy moim rozumowaniu?



Ostatnio edytowano 19 gru 2016, o 12:14 przez zorro, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2016, o 11:54 
Offline
Użytkownik

Dołączył(a): 24 lis 2015
Posty: 36
Lokalizacja: Zakrzewko
Pomógł: 3

Jak podzielisz np 100 przez 600 to jest 0 i reszta 100. Jak podzielisz 35%600=35, bo wynikiem dzielenia jest 0 i reszta 35.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2016, o 12:19 
Offline
Użytkownik

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

Pomógł: 18

Moim zdaniem w tym przypadku kogoś troszkę poniosła fantazja. Czytelniej i prościej:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Skoro zmienna x jest zawsze mniejsza NUM, to jaki jest sens wykonywania działania x % NUM, skoro dla wszystkich x < NUM wyrażenie x % NUM = x?

Natomiast takie zastosowanie operatora modulo, jest o wiele sensowniejsze:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2016, o 12:24 
Offline
Użytkownik

Dołączył(a): 31 lip 2016
Posty: 154
Pomógł: 4

gonzicz napisał(a):
Jak podzielisz np 100 przez 600 to jest 0 i reszta 100. Jak podzielisz 35%600=35, bo wynikiem dzielenia jest 0 i reszta 35.


Teraz zaskoczyłem.
Czy moje rozumowanie jest błędne?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2016, o 12:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1188
Lokalizacja: Kraków
Pomógł: 95

I tak i nie.
Jest tak jak piszesz, bo jeżeli weźmiesz resztę z dzielenia liczby 800 przez 600, to dostaniesz 200 (i tu masz rację). Ale 200 dostaniesz też, jeżeli podzielisz 200 przez 600 (tego przypadku nie wziąłeś pod uwagę).
Sparrow-hawk napisał(a):
Skoro zmienna x jest zawsze mniejsza NUM, to jaki jest sens wykonywania działania x % NUM, skoro dla wszystkich x < NUM wyrażenie x % NUM = x?
A masz całkowitą pewność, że zawsze x < NUM? Właśnie dlatego stosuje się zapis x % NUM, tak na wszelki wypadek.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2016, o 13:12 
Offline
Użytkownik

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

Pomógł: 18

W tym przypadku, który był powyżej mam.

Po za tym, co to znaczy tak na wszelki wypadek. To znaczy mam zmienną, co do której wartości nie jestem pewien? Taki zapis jak powyżej owszem, będzie działał dla zmiennych większych niż NUM, ale tak naprawdę, to przyczyni się tylko do ukrycia błędu w kodzie. Bo chyba pisząc taki kod, zakładasz, że zmienna x będzie zawsze mniejsza od NUM.

Jeżeli zamiast do NUM, twoja zmienna x będzie hulać od 0 do 32767, to co ile zdarzeń stracisz synchronizację?

Zastanawiam się, czy kompilator wiedząc, że zmienna x < NUM zoptymalizuje kod i wyrzuci te operacje modulo?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2016, o 13:28 
Offline
Moderator
Avatar użytkownika

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

Sparrow-hawk napisał(a):
Moim zdaniem w tym przypadku kogoś troszkę poniosła fantazja.

A moim zdaniem kolega kompletnie nie ma wyobraźni i stąd pisze tego typu głupoty ....

Ja rozumiem, że można nie zgadzać się z pewnym tokiem przekazywania wiedzy czy sposobu dydaktycznego ale takie personalne prztyki to głupota poniżej krytyki ....

To zrozumiałe, że w przypadku który pokazuję w poradniku akurat można byłoby się obejść bez modulo ... czyli w ten sposób

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


Są jednak ważne powody dlaczego postanowiłem w taki a nie inny sposób zaprezentować wykorzystanie modulo ...

1. Dlatego, żeby początkujące osoby mogły lepiej zrozumieć w ogóle działanie modulo i jak można się nim posługiwać w kodzie - rozdzielać np zadania w prosty sposób w zależności od czasu

2. Dlatego, że jeśli NAWET w tym przypadku z poradnika, gdybym chciał zrealizować nieco inne częstotliwości operacji np:

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


to co? no pytam ... to co ? .... Przykład w poradniku akurat konstruowałem pod kątem robala i równych odcinków czasu dlatego na końcu ograniczyłem mstick do 599 bo był konkretny cel do realizacji ... lecz widać po tym przykładzie jak fajnie można go modyfikować i stosować wiele różnych modyfikacji - dostosowując do własnych potrzeb - tak jak przykład wyżej. Gdyby nie fakt, że mnóstwo osób po obejrzeniu poradnika, podkreślam MNÓSTWO osób dostrzegło te możliwości i wpadło na własne pomysły zastosowań modulo we własnych kodach - to nie pisałbym tego co piszę .... Ale mam bardzo dobry kontakt ze swoimi widzami i czytelnikami .... stąd wiem, że ten poradnik i TEN SPOSÓB przekazu informacji bardzo dobrze się przyjął.

Oczywiście są również osoby początkujące, którym i ten przykład jeszcze ciężko zrozumieć ... dlatego jest to forum aby dopytać i pomóc sobie nawzajem .... bo warto

To że kolega Sparrow-hawk ma wiedzę z zakresu C to pewnie oczywiste tak samo jak to, że kompletnie nie potrafi czegoś szerzej wyjaśnić i przekazać tej swojej wiedzy, nawet nie jest tym zainteresowany - woli po prostu przeszkadzać .... A na to nie pozwolę sobie - przynajmniej na tym forum ... proszę sobie popierniczyć o swoich fantazjach na innych forach czy własnym blogu. Bo dyskutować to pan się musisz dopiero uczyć od samego początku.

------------------------ [ Dodano po: 3 minutach ]

Marhef napisał(a):
A masz całkowitą pewność, że zawsze x < NUM? Właśnie dlatego stosuje się zapis x % NUM, tak na wszelki wypadek.


nie nie, to nie jest na wszelki wypadek i jak mówię - można byłoby w takim przykładzie pominąć modulo ale przeanalizuj sobie ten przypadek nieco bardziej rozbudowany, który pokazałem wyżej - ale jeszcze raz go przytoczę


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


tu widać już w PEŁNI jak można sobie regulować pięknie czasem wywoływanych procesów oraz - ich częstotliwością

_________________
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: 19 gru 2016, o 13:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1188
Lokalizacja: Kraków
Pomógł: 95

Mirku, w rozbudowanym przykładzie wkradł się błąd... taki malutki:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Nigdy reszta z dzielenia przez 200 nie będzie równa 200 (piszę, żeby nie zaciemniać początkującym).
mirekk36 napisał(a):
nie nie, to nie jest na wszelki wypadek i jak mówię - można byłoby w takim przykładzie pominąć modulo ale przeanalizuj sobie ten przypadek nieco bardziej rozbudowany, który pokazałem wyżej
Nie miałem podglądu na cały kod, i może nieprecyzyjnie się wyraziłem. Miałem na myśli sytuację, kiedy z kodu nie wynika górna granica wartości zmiennej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2016, o 14:10 
Offline
Moderator
Avatar użytkownika

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

Marhef napisał(a):
Mirku, w rozbudowanym przykładzie wkradł się błąd... taki malutki:

No oczywiście masz rację - sorki - piszę na szybko to i o pomyłkę łatwo poprawię to tak

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


------------------------ [ Dodano po: 2 minutach ]

Marhef napisał(a):
Miałem na myśli sytuację, kiedy z kodu nie wynika górna granica wartości zmiennej.


generalnie górna granica zmiennej zawsze będzie granicą typu jeśli puścimy ją na żywioł ;) czyli dla uint8_t będzie to 255, dla uint16_t będzie to 65535 itd i czasem wystarczy nawet takie podejście gdy nie jest to aż tak istotne czy podczas przekręcania się licznika jakieś nasze rzekome procesy się nie odpalą albo odpalą nie w tej kolejności jednorazowo ... czasem ma to małe albo drugorzędne znaczenie

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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