Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Skrócony regulamin

[C] Zwracana wartość



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> C i C++
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Dijskra



Dołączył: 13 Lut 2012
Posty: 2

PostWysłany: Pon Lut 13, 2012 8:57 pm      Temat postu: [C] Zwracana wartość Odpowiedz z cytatem Pisownia

Witam, chciałem tylko aby ktoś starszy i mądrzejszy sprawdził moje rozumowanie:

Kod:
char CheckDelay (unsigned int t)
{
  return(((t - a & 0x8000) >> 8);
}


Jest to kawałek kodu większego programu, który w obecnej chwili rozpracowuje. Problem zapewne dla wielu trywialny, mimo to chcę się upewnić.
Mamy wartość wejściową int t (załóżmy że wyrażenie : t - a = 1003), zamieńmy tą liczbę na szesnastkową: 1003 = 3EB
Teraz 3EB dwójkowo :
0011 1110 1011
0x8000 dwójkowo :
1000 0000 0000 0000

koniunkcja & :

0000 0000 0000

i przesunie o 8 miejsc w prawo (>> 8) daje to samo.

Czy to jest poprawne obliczenie ? I jeszcze tak jedna sprawa - jak rozumiem wyrażenia bitowe są uznawane za true, jeśli przynajmniej jeden bit z ciągu ma wartość równą 1. Pytam, bo później zwrot z tej funkcji (CheckDelay) jest w warunku if , wiec wydaje się bezsensu przesuwanie o te 8 bitów. Ale być może się mylę.

Kompilator : avr - gcc

Pozdrawiam.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
mikmas



Dołączył: 26 Maj 2005
Posty: 5617
Skąd: From Alex Stadt

PostWysłany: Wto Lut 14, 2012 7:16 am      Temat postu: Odpowiedz z cytatem Pisownia

Tak, dobrze rozumiesz. Jednak jeżeli chodzi o przesunięcie, to chodzi o to, aby się zmieściło w char, które jest 1B.

Cytat:
jak rozumiem wyrażenia bitowe są uznawane za true, jeśli przynajmniej jeden bit z ciągu ma wartość równą 1

W skrócie: jeżeli wartość nie jest zerowa to if "przechodzi dalej" (tudzież inne warunkowe)

_________________
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS d- s---:--->+:+ a-->--- C++(+++) U-- P+ L-- E--
W++ N+ o-- K- w++(+++) O--- M-(--) V-- PS PE++ Y
PGP- t 5 X++ R tv- b+ DI- D+++(++++) G++ e h* r+ y?
------END GEEK CODE BLOCK------
Alternatywny komunikator GG
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora Numer GG Tlen
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 17278
Skąd: z drugiej strony Kabla

PostWysłany: Wto Lut 14, 2012 8:46 am      Temat postu: Odpowiedz z cytatem Pisownia

Dijkstra:
Dobrze, że to nie aplikacja desktopowa, bo zaliczałoby się do typowych przykładów przedwczesnej optymalizacji i jej nieoczekiwanych, ale spodziewanych skutków. W uC jeszcze przejdzie.

Wyrażenie to - przy założeniu wyniku prawda/fałsz - jest funkcją, która daje prawdę dla każdego t i a, których różnica ma na szesnastym bicie 1, czyli jest w zakresie:
[n · 65536 + 32768 ; (n+1) · 65536), dla n=0, 1,...
(przy założeniu, że t jest niemniejsze od a)
W załączniku obrazek, który prezentuje tę funkcję. Zielone obszary to te, gdzie mamy prawdę.

Widać jak na dłoni, że coś tu nie gra, bo funkcja jest okresowa. Nie to, żeby w programowaniu takowe się nie pojawiały, ale poza kilkoma sytuacjami (i ta do nich nie należy) wyrazenia dające takie obrazy są rzadkie. Należy zatem przyjąć, że albo autor był nieprzytomny i zrobił błąd, albo jest jeszcze jakieś niejawne założenie. Obstawiam, że tym założeniem jest, że przynajmniej t jest zmienną 16-bitową. To ogranicza nam mocno zakres funkcji (do tego żółtego obszaru). Tym samym funkcja da prawdę tylko w tym małym, jasnozielonym trójkącie. A co ten trójkąt oznacza? Ano to, że różnica musi być większa od 32768. Czyli:
Kod:
int CheckDelay(unsigned int t) {
    return t - a > 32768;
}
I teraz powinno być jasne, co ten zapis ma oznaczać...


cc-avfd-9363ed3e533e9877bad51691e06ba0b6.png
 Opis:

Pobierz
 Nazwa pliku:  cc-avfd-9363ed3e533e9877bad51691e06ba0b6.png
 Wielkość pliku:  17.49 KB
 Pobierano:  35 raz(y)


_________________
Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok.
"Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
mikmas



Dołączył: 26 Maj 2005
Posty: 5617
Skąd: From Alex Stadt

PostWysłany: Wto Lut 14, 2012 9:14 am      Temat postu: Odpowiedz z cytatem Pisownia

Ciekawe wytłumaczenie. Też skorzystam :P
_________________
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS d- s---:--->+:+ a-->--- C++(+++) U-- P+ L-- E--
W++ N+ o-- K- w++(+++) O--- M-(--) V-- PS PE++ Y
PGP- t 5 X++ R tv- b+ DI- D+++(++++) G++ e h* r+ y?
------END GEEK CODE BLOCK------
Alternatywny komunikator GG
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora Numer GG Tlen
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 17278
Skąd: z drugiej strony Kabla

PostWysłany: Wto Lut 14, 2012 9:21 am      Temat postu: Odpowiedz z cytatem Pisownia

To sprawdź przy okazji, czy się nie pomyliłem w obliczeniach, bo jestem po nieprzespanej nocy ;).
_________________
Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok.
"Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Dijskra



Dołączył: 13 Lut 2012
Posty: 2

PostWysłany: Wto Lut 14, 2012 8:01 pm      Temat postu: Odpowiedz z cytatem Pisownia

Witam ponownie !

Dziękuję za odpowiedzi.

Cytat:
Wyrażenie to - przy założeniu wyniku prawda/fałsz - jest funkcją, która daje prawdę dla każdego t i a, których różnica ma na szesnastym bicie 1, czyli jest w zakresie:
[n · 65536 + 32768 ; (n+1) · 65536), dla n=0, 1,...
(przy założeniu, że t jest niemniejsze od a)


To jest dla mnie zrozumiałe i logiczne, tylko jedna poprawka typ int jest 16 bitowy tak więc maksymalna wartość to 0xFFFF = 65535. Co do samej funkcji :

Kod:
char CheckDelay (unsigned int t)
{
  return(((t - a) & 0x8000) >> 8);
}


zmienna a również jest typu unsigned int, i jest inkrementowana o 1 co 1 ms działana programu. Tak więc wartość t -a (przy t = 1004) zostanie przepełnione po 1005 milisekundach dzialania programu i wówczas osiągnie wartość 65535, równoznaczne z true dla warunku. Warunek będzie spełniony przez kolejne 65535 - 32768 = 32767ms działania programu. Funkcja przypisująca wartość t wygląda tak :

Kod:
unsigned int SetDelay(unsigned int t)
{
  return(a + t - 1);
}


Tak więc jak mi się wydaje ma to za zadanie po prostu wykonanie pewnej instrukcji programu w ściśle określonych odstępach czasu.

Cytat:
Tak, dobrze rozumiesz. Jednak jeżeli chodzi o przesunięcie, to chodzi o to, aby się zmieściło w char, które jest 1B


No tak zapomniałem że char jest 8 bitowy, bez tego przesunięcia obcięło by mi idealnie tą 1 z 16 bitu.

Teraz chyba już wszystko jest to dla mnie zrozumiałe.
Jeszcze raz dziękuje za pomoc i pozdrawiam.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> C i C++ Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.20137 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | VB4all | Tansze zakupy w Helionie |