ATNEL tech-forum https://forum.atnel.pl/ |
|
Operator porównania a znak ~ https://forum.atnel.pl/topic18108.html |
Strona 1 z 2 |
Autor: | Kroniowiorka [ 8 kwi 2017, o 18:28 ] |
Tytuł: | Operator porównania a znak ~ |
Witam pisze właśnie kod w którym mam 2 wartości, pierwsza wartość to jakaś przypadkowa liczba, druga jest zanegowaniem wartości pierwszej. Gdy wykonuje danego ifa to pojawia się zawsze error. język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Lecz gdy dodam linijkę język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Dlaczego więc tylda w przypadku operacji porównania nie działa? |
Autor: | Daro69 [ 8 kwi 2017, o 18:39 ] |
Tytuł: | Re: Operator porównania a znak ~ |
to by znaczyło że zanegowany val2 jest różny od val1. val1 jest identyczne z val2 przed ifem w pierwszym syntaksie ? |
Autor: | Kroniowiorka [ 8 kwi 2017, o 18:44 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Daro69 napisał(a): to by znaczyło że zanegowany val2 jest różny od val1. val1 jest identyczne z val2 przed ifem w pierwszym syntaksie ? Dlaczego to by znaczyło że zanegowany val2 jest różny od val1 przecież gdy neguje w osobnej linijce wszystko działa. I dla jasności gdy neguje w osobnej linijce to tą tyldę z ifa wyrzucam. |
Autor: | SunRiver [ 8 kwi 2017, o 18:47 ] |
Tytuł: | Re: Operator porównania a znak ~ |
czytając twojego ifa : Jeśli val1 jest równe ~val2 to wyświetl OK , jeśli nie wyświetl error i jak widzisz działa prawidłowo gdyż wartości są różne i warunek nie zostaje spełniony co powoduje że np wartość 5 nie jest równa -5 jeśli zaś zanegujesz w osobnej linijce val2 to każesz wartość np 5 zanegować uzyskujesz -5 a w ifie ponownie negujesz wiec masz 5 co powoduje że jeśli np val1 = 5 to val2 w tym momencie też przyjmuje wartość 5 i warunek zostaje spełniony taki przykład obrazowy ... |
Autor: | Kroniowiorka [ 8 kwi 2017, o 18:56 ] |
Tytuł: | Re: Operator porównania a znak ~ |
SunRiver napisał(a): w ifie ponownie negujesz Jak napisałem u góry nie neguje 2 razy bo w momencie gdy używam tyldy w osobnej linijce tylde z ifa wyrzucam. |
Autor: | SunRiver [ 8 kwi 2017, o 19:07 ] |
Tytuł: | Re: Operator porównania a znak ~ |
w tym wypadku pomyśl dlaczego warunek został spełniony jaką wartość przyjął val2 |
Autor: | Daro69 [ 8 kwi 2017, o 19:14 ] |
Tytuł: | Re: Operator porównania a znak ~ |
a..; dobra.. tu chodzi oto że przy tej samej wartości val1. język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. a w tym wypadku: wynikiem jest"error" |
Autor: | Kroniowiorka [ 8 kwi 2017, o 19:21 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Daro69 dokładnie o to chodzi. |
Autor: | Daro69 [ 8 kwi 2017, o 19:22 ] |
Tytuł: | Re: Operator porównania a znak ~ |
czy val1 i val2 są tego samego typu ? |
Autor: | Kroniowiorka [ 8 kwi 2017, o 19:40 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Tak |
Autor: | Daro69 [ 8 kwi 2017, o 20:09 ] |
Tytuł: | Re: Operator porównania a znak ~ |
A w jakim środowisku pisany program ? Może optymalizacja załączona jakaś. ? może pomoże przydomek volatile przed powołaną zmienną, choć to rozwiązanie nie profesjonalne chyba w tym wypadku. ? |
Autor: | Kroniowiorka [ 8 kwi 2017, o 20:18 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Pisze w Eclipse a co do optymalizacji to nigdy w cos takiego się nie bawiłem więc najprawdopodobniej jest wszystko domyślnie. Po dodaniu volatile nadal to samo. |
Autor: | Wirnick [ 9 kwi 2017, o 07:36 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Błąd nie zależy od środowiska programowania, ale od logiki działania funkcji porównania "jeżeli" - if(). Czy prawdą jest, że np. 5 = -1*5 . Ten matematyczny zapis odpowiada Twojemu zapytaniu if(val2 == ~val2). Warunek zawsze jest FALSE - nie wykona się kolejne po nim polecenie. |
Autor: | mirekk36 [ 9 kwi 2017, o 07:52 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Wirnick napisał(a): Błąd nie zależy od środowiska programowania, ale od logiki działania funkcji porównania "jeżeli" - if(). Czy prawdą jest, że np. 5 = -1*5 . Ten matematyczny zapis odpowiada Twojemu zapytaniu if(val2 == ~val2). Warunek zawsze jest FALSE - nie wykona się kolejne po nim polecenie. DOKŁADNIE - zresztą już wcześniej SunRiver o tym pisał no jak można się spodziewać że warunek typu język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. kiedykolwiek będzie spełniony ? no jak Nie ważne środowisko, nie ważny język programowania ... jak można się spodziewać że to będzie spełnione ? (to tak jakbyś w realnym świecie zapytał: czy moja żona to nie jest moja żona? prawda czy fałsz? No PEWNIE ŻE FAŁSZ bo moja żona to moja żona!) podobnie jak można się spodziewać, że z kolei taki zabieg język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. powoduje że warunek jest ZAWSZE SPEŁNIONY ... no jak można spodziewać się innego działania ? |
Autor: | Wirnick [ 9 kwi 2017, o 08:07 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Jeszcze dopowiem - co to jest " ~ " ? Otóż jest to zaprzeczenie, negacja w mowie potocznej, a w matematyce i logice współczynnik ; -1 . I tak - iloczyn ( int(-1 * a) ) jest liczbą ujemną, natomiast na nasze żądanie podlega zaokrągleniu ( uint8_t(-1* a) ) jest liczbą dodatnią o wartości 0. |
Autor: | Daro69 [ 9 kwi 2017, o 11:48 ] |
Tytuł: | Re: Operator porównania a znak ~ |
O kurka. Teraz to i ja się zakręciłem z tą tyldą. jeżeli to jest operator bitowy ~ , to myślałem że wiem chyba co robi. Okazuje się że ma jeszcze inne działanie. bo np. język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
................................................................. Wirnick napisał(a): Błąd nie zależy od środowiska programowania, ale od logiki działania funkcji porównania "jeżeli" - if(). Czy prawdą jest, że np. 5 = -1*5 . Ten matematyczny zapis odpowiada Twojemu zapytaniu if(val2 == ~val2). Warunek zawsze jest FALSE - nie wykona się kolejne po nim polecenie. to jak to jest z tą tyldą w tym momencie i dlaczego tylda to " -1 * zmienna " zawala mi się mój mały światek programowania. O CZYM NIE WIEM ? |
Autor: | mirekk36 [ 9 kwi 2017, o 12:13 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Daro69 napisał(a): e i dlaczego tylda to " -1 * zmienna " Ale wcale nie mnoży "-1 * zmienna" toż kolega wyżej użył przykładu .... zrozum to to samo co ja podałem wyżej w przykładzie w warunku z "czy moja żona to nie moja żona?" ------------------------ [ Dodano po: 4 minutach ] Wirnick napisał(a): Jeszcze dopowiem - co to jest " ~ " ? Otóż jest to zaprzeczenie, negacja w mowie potocznej, a w matematyce i logice współczynnik ; -1 . I tak - iloczyn ( int(-1 * a) ) jest liczbą ujemną, natomiast na nasze żądanie podlega zaokrągleniu ( uint8_t(-1* a) ) jest liczbą dodatnią o wartości 0. No nie - tu to kolega "troszkę" popłynął tylda to nie jest żadna negacja w jakiejś tam mowie potocznej - sorki ale to nie ma sensu. Jest proste i jasne jak drut wyjaśnienie i nie ma co z tym w ogóle dyskutować nawet I to nie jest moje wyjaśnienie, żeby nie było że ja koło wymyślam TYLDA - to operator negacji binarnej i Quniec, żadne tam potoczne coś .... język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. czy tu coś trzeba więcej wyjaśniać ? |
Autor: | Daro69 [ 9 kwi 2017, o 13:01 ] |
Tytuł: | Re: Operator porównania a znak ~ |
OK. sorka że się tak uparłem, ale podobny temat z negacją w ifie pojawia się sukcesywnie na naszym forum i chciałem zrozumieć dlaczego nie zadziała sposób którego właściwie nigdy nie używam. Czyli nie można w sprawdzaniu warunku stosować negacji(jakby w locie). linijka 15. język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. .............................................................................................. negacja musi być przypisana do jakiejś zmiennej wynikowej choćby tak: linijka 15. język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Chyba teraz mogę sobie to utrwalić jako zasadę stosowania tyldy w ifie . |
Autor: | Kroniowiorka [ 9 kwi 2017, o 13:07 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Wirnick napisał(a): Błąd nie zależy od środowiska programowania, ale od logiki działania funkcji porównania "jeżeli" - if(). Czy prawdą jest, że np. 5 = -1*5 . Ten matematyczny zapis odpowiada Twojemu zapytaniu if(val2 == ~val2). Warunek zawsze jest FALSE - nie wykona się kolejne po nim polecenie. Chyba za bardzo nie zrozumiałeś o co mi chodzi. Po pierwsze w ifie jest if(val1 == ~val2). a nie if(val2 == ~val2) tak jak Ty napisałes. Po drugie jak napisałem val2 jest negacją val1 więc na twoim przykładzie to będzie 5 = -1*(-5). Dlaczego to nie jest prawdą? EDIT: Chyba tylko Daro69 zrozumiał o co mi chodzi. Właśnie pytam od początku dlaczego ta jak on to nazwał "negacja w locie" nie działa. |
Autor: | mirekk36 [ 9 kwi 2017, o 13:37 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Kroniowiorka napisał(a): Chyba tylko Daro69 zrozumiał o co mi chodzi. Właśnie kłopot w tym że Daro69 tak samo nie rozumiał może do tej pory a może nadal jeszcze sprawia mu trudność jak tobie bo pisze wyżej: Daro69 napisał(a): Czyli nie można w sprawdzaniu warunku stosować negacji(jakby w locie). linijka 15. A dlaczego niby nie można ? Kto tak powiedział że nie można ? wręcz odwrotnie nie tylko można ale często się używa negacji w warunkach IF tylko że trzeba przemyśleć działanie programu Obydwaj panowie widzę macie ten sam problem i jakoś nie możecie w dziwny sposób zaskoczyć .... o co chodzi Ale tak to jest gdy ktoś poda ... żeby nie obrazić nikogo no ale NIELOGICZNY z założenia warunek czyli język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. pytam - jest w TYM warunku IF jakaś logika ? żeby w ogóle robić taki warunek w przypadku takiego kodu ? No zastanówcie się PRZECIEŻ ZAWSZE wynikiem tego warunku będzie FAŁSZ - a wy się obydwaj dziwicie dlaczego ? i zastanawiacie się czy to kompilator czy środowisko czy coś tam jeszcze ------------------------ [ Dodano po: 11 minutach ] może inny przykład obrazowy język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. czyli język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. tu nawet nie chodzi o język programowania - tu chodzi o samą logikę zadawania warunków IF negację bitową JAK NAJBARDZIEJ można wykorzystywać w warunkach - prosty przykład. Wyobraźcie sobie, że otrzymujecie kody z pilota gdzie dostajecie w zmiennej cmd1 - wartość odebranej komendy natomiast w cmd2 - zanegowaną już wartość komendy takie zabezpieczenie stosowane jest w pilotach np Samsung, ramka jest przesyłana w postaci normalnej i zanegowanej więc teraz jeśli chcę sprawdzić czy nie ma błędu transmisji to muszę to jakoś sprawdzić warunkiem czyli: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Czy teraz jaśniej ? .... Nie ma zaś KOMPLETNEGO SENSU robić takiego warunku na dwóch różnych zmiennych które zawierają tę samą wartość bo wtedy warunek IF traci sens kompletnie |
Autor: | Kroniowiorka [ 9 kwi 2017, o 13:54 ] |
Tytuł: | Re: Operator porównania a znak ~ |
mirekk36 napisał(a): val1 = val2; if( val1 == ~val2 ) .... else .... Napisałeś w kodzie że val1=val2 gdy ja napisałem już ze 2 razy że te dwie wartości NIE SĄ równe. val2 jest negacją val1 więc zamiast twojego zapisu powinno być. |
Autor: | mirekk36 [ 9 kwi 2017, o 14:05 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Kroniowiorka napisał(a): //ten if nie jest spełniony jest jest spełniony tylko jak zwykle .... trzeba pamiętać o domyślnej promocji do INT http://atnel.pl/domyslna-promocja-do-typu-int.html wtedy byś ten warunek napisał jak się należy, czyli język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. czyli ? ostatecznie ??? .... jawne rzutowanie do typu o który tobie chodzi - jeśli więc masz zmienne 8-bitowe to takie rzutowanie robimy bo domyślnie porównanie nastąpi na typach int |
Autor: | Daro69 [ 9 kwi 2017, o 14:09 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Panowie, mi już się głowa gotuje. Dlaczego w tym przykładzie wyświetla się fałsz. ? Przykład 1 z kilka postów wcześniej: język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Poddaję się. lejcie, tylko nie po głowie. ....................................................... jasny gwint.. znowu ta promocja. |
Autor: | Kroniowiorka [ 9 kwi 2017, o 14:12 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Dobra dzięki wielki nie miałem pojęcia że coś takiego istnieje, teraz działa. |
Autor: | mirekk36 [ 9 kwi 2017, o 16:25 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Daro69 napisał(a): znowu ta promocja. A no właśnie wszędzie promocja i promocja |
Autor: | Daro69 [ 9 kwi 2017, o 16:51 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Dzięki Mirku, przecież już się kiedyś na tę promocję nabrałem. muszę sobie jeszcze raz poukładać. Wszystko można co nie można, tylko z wolna i z ostrożna. Trzeba tylko uważać na promocje bo mieszają w głowie. . INT w gratisie. |
Autor: | Jarecki [ 9 kwi 2017, o 20:48 ] |
Tytuł: | Re: Operator porównania a znak ~ |
czyli po negacji ~val2 język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. następuje porównanie typu uint8_t z int zamiast uint8_t z uint8_t tak? |
Autor: | Daro69 [ 9 kwi 2017, o 21:01 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Jarecki napisał(a): następuje porównanie typu uint8_t z int zamiast uint8_t z uint8_t tak? if(val1 == (~val2) ) cytat skrawka wyjaśnienia, z podanego przez Mirka linku. "zostanie obliczone za naszymi plecami i umieszczone w przejściowej zmiennej o rozmiarze dwóch bajtów, a nie jednego jakby wydawać się mogło" dlatego należy zapisać if(val1 == (uint8_t) ~val2 ) // rzutowanie szczegóły pod linkiem. http://atnel.pl/domyslna-promocja-do-typu-int.html |
Autor: | mirekk36 [ 9 kwi 2017, o 21:09 ] |
Tytuł: | Re: Operator porównania a znak ~ |
Daro69 ---> nic dodać nic ująć |
Autor: | Daro69 [ 9 kwi 2017, o 22:19 ] |
Tytuł: | Re: Operator porównania a znak ~ |
OK. Dla tych co jeszcze nie bardzo wiedzą o co biega. język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. /* ----- sprawdzam czy negacja 240 to 15, ? wynikiem jest - że nie jest . ? Dlaczego? ! .................................................................... aby wykonać negację " dwiescieczterdziesci", obliczenie jest zrealizowane w przejściowej zmiennej int. i ma postać 240->( 0000 0000 1111 0000) a po negacji (1111 1111 0000 1111) Nijak się ma do 15 (0000 0000 0000 1111) - dlatego false i kiszka. */ język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Tak mi to wyszło. |
Strona 1 z 2 | Strefa czasowa: UTC + 1 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |