Stránka 1 z 1

Porovnanie dvoch znakov

Napsal: 04 dub 2018, 08:29
od Ivan
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

Re: Porovnanie dvoch znakov

Napsal: 04 dub 2018, 10:27
od gilhad
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

Napsal: 04 dub 2018, 12:56
od K380
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 184 x

Re: Porovnanie dvoch znakov

Napsal: 06 dub 2018, 15:45
od zbysek
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 :)

Re: Porovnanie dvoch znakov

Napsal: 09 dub 2018, 08:22
od Ivan
Už to mám vyriešené.Dva reťazce porovnávam pomocou: strcmp.Ak je zhoda,funkcia vracia nulu.Funguje to dobre. :D