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



Teraz jest 8 lis 2024, o 15:01


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 25 lis 2016, o 20:19 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 19 lis 2016
Posty: 21
Pomógł: 0

Witam wszystkich
Jestem nowy i prosił bym o wyrozumiałość ponieważ dopiero zaczynam z arduino jak i z C++ .
Używam eclipse neon arduino ( 2 dni walki z instalkami) dla czego ? orginalne ide Arduino potrafiło wywalić błąd gdy za komentowałem linie delay(100); w ogóle zaczęło żyć własnym życiem i było nie do zniesienia
Za radą Pana Mirka postanowiłem przesiąść się na eclipsa ale do rzeczy...

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


Opis programu :
program po inicjacji pobiera liczbę z zmiennej float "liczba" następnie wyświetla ja na wyświetlaczu i poddaje rozkładowi (void liczbaToCyfry) na int cyfra1-5
żeby na końcu wysłać te dane serialem

problem :
problem jest w poprawności rozkładu liczby.Wszystko pięknie działa od 0 do liczby 40000 gdy licznik "liczba" przekręca się na 40000 w zmiennych int cyfra2,3,4 pojawiaja sie liczby dwu , 3 cyfrowe
i nie potrafię już drugi dzień dojść do źródła problemu
Był bym bardzo wdzęczny za oświecenie mej ułomności :)

Dopisze jeszcze wynik działania
40000.00
0
3
9
9
9
9
0
0
40001.00
0
4
65
660
6560
8
0
0
Pozdrawiam



Ostatnio edytowano 26 lis 2016, o 13:44 przez tommot, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2016, o 22:20 
Offline
Nowy

Dołączył(a): 23 gru 2014
Posty: 13
Pomógł: 0

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


Popatrz 40000/100000 daje 0.4
Wydaje mi się że masz za dużo o jedno 0, analogicznie dalej w kodzie przewija się ten sam błą


Jeśli chodzi o dzieleni, spróbuj z modulo i dzieleniem przez 10 (myślę że tak jest prościej, a i o pętelkę można się pokusić), np tak :

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


Pamiętaj, jednak że liczba musi być typem int.
Jakbyś nie wiedział za co odpowiedzialne jest modulo zapraszam do jednego z ostatnich poradników p. Mirka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2016, o 23:05 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 19 lis 2016
Posty: 21
Pomógł: 0

evill napisał(a):
Popatrz 40000/100000 daje 0.4
Wydaje mi się że masz za dużo o jedno 0, analogicznie dalej w kodzie przewija się ten sam błą


Wydaje mi się że tak być powinno 0.4 ma wychodzić bo jest to 6 miejsce które 040000 ma być jeszcze zerem w zmiennej int cyfra0 zostanie umieszczone 0 a nie 0.4 czyli poprawnie
Gdy liczba będzie 100000 w tedy zmienna cyfra0 wypełni 1
Problem myślę jest bardziej złożony bo jak pisałem wcześniej każda liczba od 0 do 39999 wyświetla się poprawnie

Przepraszam ale nie umiem zastosować twojego przykładu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2016, o 23:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Nie używamy float w mikrokontrolerach. Dlatego nie ma jak pomóc :(
Wyskakujesz działaniem poza zakresy liczb int chyba na moje oko...

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2016, o 01:48 
Offline
Użytkownik

Dołączył(a): 28 wrz 2016
Posty: 215
Pomógł: 14

Problem jest w działaniu (cyfra1 * 10000). Ponieważ cyfra1 jest typu int, to całe wyrażenie też jest typu int. Gdy cyfra1=3, nie ma problemu, bo wartość wyrażenia (cyfra1 * 10000) wynosi 30000 i miesci sie w zakresie int, tzn od -32,768 to 32,767. Ale gdy cyfra1=4, to wyrażenie (cyfra1 * 10000) ma wartość 40000 i jest poza zakresem.
A dokładnie, to wyrażenie jest obliczane i ma wartość 40000, ale jest konwertowane do typu int i ma wartość ujemną (-25536).
Zmiana typu z int cyfra1 = 0; na unsigned int cyfra1 = 0; rozwiązuje problem (przynajmniej dla 40000).
Poza tym ten algorytm jest mało efektywny, bo wielokrotnie powtarza te same operacje. Propozycja kolegi evill jest dużo lepsza. Mogłoby wyglądać to tak
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


sq5rix napisał(a):
Nie używamy float w mikrokontrolerach. Wyskakujesz działaniem poza zakresy liczb int chyba na moje oko...

Słuszna uwaga i dobre oko.


Autor postu otrzymał pochwałę

_________________
de gustibus non est disputandum



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2016, o 07:02 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 19 lis 2016
Posty: 21
Pomógł: 0

Rewelacyjne opisanie problemu ... właśnie tego mi brakowało
Dziękuje Panowie za wyczerpujące rozwiązanie problemu
Pozdrawiam :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2016, o 11:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Niech kolega rewelacyjnie poprawi listing w 1 poście ...

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



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: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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