Porovnanie dvoch znakov
Porovnanie dvoch znakov
Zdravím,experimentujem s prenosom na 433MHz.Prenos funguje.Potrebujem zistiť na Rx ktorý znak,alebo reťazec bol odoslaný.Skúšal som to s príkazom : if(msg=="A"){digitalWrite(3,LOW);} (bolo odoslané: char *msg="A"; )Na strane Rx bolo vypísane pomocou Serial.print A ale príkaz sa nevykonal,lebo sa zrejme nenašla zhoda.Skúsil som to príkazom: int a=int strcmp(const char* "A",const char* msg)_ATTR_PURE_; po verify vypisuje:
expected primary-expression before "int"
Prosím o pomoc ako identifikovať odoslaný znak,aby som mohol vetviť program na Rx strane.
Ďakujem Ivan
expected primary-expression before "int"
Prosím o pomoc ako identifikovať odoslaný znak,aby som mohol vetviť program na Rx strane.
Ďakujem Ivan
Re: Porovnanie dvoch znakov
pokud jde o porovnani znaku, tak znaky se uzaviraji do aprostrofu zn == 'A' ; Pokud jde o porovnani retezce, tak bud funkci na to urcenou, nebo porovnavat po znacich. Pro retezce nemuzes rozumne pouzit == (msg == "A" nefunguje jak bys potreboval)
Re: Porovnanie dvoch znakov
zkus tento program, používám ho pro získání kódu z dálkového ovládače zásuvek 433 MHz-
Re: Porovnanie dvoch znakov
Tady je to trochu komplikovanější.
Zápisy 'A' a "A" vypadají stejně, ale překladač vidí dvě odlišné věci.
'A' je pro překladač číselná hodnota, kterou má znak A v ASCII tabulce, tedy 65 (desítkově).
"A" je pro překladač řetězec znaků, který obsahuje dva znaky: 'A' a '\0' (znak pro konec řetězce v C/C++).
Je to tedy vlastně dvouprvkové pole znaků (char[2], můžeme psát i char*).
A dá se říci, že pole vidí překladač jako adresu jejich prvního prvku.
a také:
Aby to ale nebylo tak jednoduché:
I když máme dva různé řetězce (dvě různé adresy) se stejným obsahem, může si překladač říct, že v rámci optimalizace uloží oba řetězce na stejné místo.
A pak je výsledek true, i když bychom možná čekali false.
A ještě to má jeden háček. Arduino má v sobě objekt String, který je určený pro uchovávání řetězců.
Místo:
pak píšeme
String má přetížený operátor rovnosti (==) a dělá to, co bychom od rovnosti skutečně očekávali:
Tak snad jsem to trochu objasnil
Zápisy 'A' a "A" vypadají stejně, ale překladač vidí dvě odlišné věci.
'A' je pro překladač číselná hodnota, kterou má znak A v ASCII tabulce, tedy 65 (desítkově).
"A" je pro překladač řetězec znaků, který obsahuje dva znaky: 'A' a '\0' (znak pro konec řetězce v C/C++).
Je to tedy vlastně dvouprvkové pole znaků (char[2], můžeme psát i char*).
A dá se říci, že pole vidí překladač jako adresu jejich prvního prvku.
Kód: Vybrat vše
char ca[] = "A";
char a = 'A';
if(ca == "A") {} // je false -> porovnáváme dvě různé adresy (i když se stejným obsahem)
if(a == 'A') {} // je true -> porovnáváme dvě stejné hodnoty
Kód: Vybrat vše
char x[] = "A"; // do x si uložíme adresu řetězce "A"
char *y = x; // do y si uložíme hodnotu, která je uložená v x -> v x je zrovna adresa onoho řetězce
if(x == y) // je true! máme v obou stejné adresy
Kód: Vybrat vše
"A" == "A"
A pak je výsledek true, i když bychom možná čekali false.
A ještě to má jeden háček. Arduino má v sobě objekt String, který je určený pro uchovávání řetězců.
Místo:
Kód: Vybrat vše
char a[] = "ABCD";
Kód: Vybrat vše
String a = "ABCD";
Kód: Vybrat vše
String sa = "ABC";
if(sa == "ABC") {} // je true, protože máme přetížený operátor == a dochází proto k porovnávání jednotlivých znaků.
Re: Porovnanie dvoch znakov
Už to mám vyriešené.Dva reťazce porovnávam pomocou: strcmp.Ak je zhoda,funkcia vracia nulu.Funguje to dobre.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 7 hostů