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.

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

Lecz gdy dodam linijkę
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
prezed ifem wszystko działa.

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.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
wynikiem jest "ok",
a w tym wypadku:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
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

Składnia: [ Pobierz ] [ Ukryj ]
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
Składnia: [ Pobierz ] [ Ukryj ]
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.
Składnia: [ Pobierz ] [ Ukryj ]
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 ? :roll:

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ś ;) ....

Składnia: [ Pobierz ] [ Ukryj ]
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.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
TO NIE ZADZIAŁAŁO. wyświetliło wynik falsz.
..............................................................................................
negacja musi być przypisana do jakiejś zmiennej wynikowej choćby tak: linijka 15.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
TERAZ POPRAWNIE wyswietliło prawda :D :D
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

Składnia: [ Pobierz ] [ Ukryj ]
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 ;)

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


czyli
Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
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ć.

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

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

Składnia: [ Pobierz ] [ Ukryj ]
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. :lol: :lol:
Dlaczego w tym przykładzie wyświetla się fałsz. ? :?
Przykład 1 z kilka postów wcześniej:
Składnia: [ Pobierz ] [ Ukryj ]
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. :? :roll:
.......................................................
jasny gwint.. :? :? :? znowu ta promocja. :lol: :lol: :lol:

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

Autor:  Daro69 [ 9 kwi 2017, o 16:51 ]
Tytuł:  Re: Operator porównania a znak ~

Dzięki Mirku, :D
przecież już się kiedyś na tę promocję nabrałem. :?
muszę sobie jeszcze raz poukładać. :D
Wszystko można co nie można, tylko z wolna i z ostrożna. :lol:
Trzeba tylko uważać na promocje bo mieszają w głowie. . :? INT w gratisie. :lol: :lol:

Autor:  Jarecki [ 9 kwi 2017, o 20:48 ]
Tytuł:  Re: Operator porównania a znak ~

czyli po negacji ~val2

Składnia: [ Pobierz ] [ Ukryj ]
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. :D
Składnia: [ Pobierz ] [ Ukryj ]
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. ;)
*/
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tak mi to wyszło. :P

Strona 1 z 2 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/