Porovnanie dvoch znakov

Odpovědět
Ivan
Příspěvky: 14
Registrován: 03 dub 2018, 18:51
Reputation: 0

Porovnanie dvoch znakov

Příspěvek od Ivan » 04 dub 2018, 08:29

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

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Porovnanie dvoch znakov

Příspěvek od gilhad » 04 dub 2018, 10:27

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)

K380
Příspěvky: 134
Registrován: 04 srp 2017, 12:43
Reputation: 0

Re: Porovnanie dvoch znakov

Příspěvek od K380 » 04 dub 2018, 12:56

zkus tento program, používám ho pro získání kódu z dálkového ovládače zásuvek 433 MHz-
sketch_mar16f.ino
(815 bajtů) Staženo 183 x

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18
Reputation: 0

Re: Porovnanie dvoch znakov

Příspěvek od zbysek » 06 dub 2018, 15:45

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.

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
a také:

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
Aby to ale nebylo tak jednoduché:

Kód: Vybrat vše

"A" == "A"
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:

Kód: Vybrat vše

char a[] = "ABCD";
pak píšeme

Kód: Vybrat vše

String a = "ABCD";
String má přetížený operátor rovnosti (==) a dělá to, co bychom od rovnosti skutečně očekávali:

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ů.
Tak snad jsem to trochu objasnil :)

Ivan
Příspěvky: 14
Registrován: 03 dub 2018, 18:51
Reputation: 0

Re: Porovnanie dvoch znakov

Příspěvek od Ivan » 09 dub 2018, 08:22

Už to mám vyriešené.Dva reťazce porovnávam pomocou: strcmp.Ak je zhoda,funkcia vracia nulu.Funguje to dobre. :D

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů