if (textA == textB) - was mache ich falsch?

Hallo
ich versuche einen Text über das Modul NRF24L01 zu empfangen und diesen Text auszuwerten.

Was mache ich da falsch?

/*
Library: TMRh20/RF24, https://github.com/tmrh20/RF24/

Das wird gesendet:

radio.stopListening();
const char text = “Hallo Arduino” ;
radio.write(&text, sizeof(text));

*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = {“00002”, “00001”};
int text3 = “Hallo Arduino”;

void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(address[1]);
radio.openReadingPipe(0, address[0]);
radio.setPALevel(RF24_PA_MIN);
}

void loop() {
radio.startListening();
if (radio.available()) {

char text2[13] = “”;
radio.read(&text2, sizeof(text2));
Serial.print(“Empfange:----”);
Serial.print(text2); // Der Text Hallo Arduino kommt auch an - ohne Zeichen davor oder dahinter
Serial.println("----");

if (text2 == “Hallo Arduino”) { // Hier passiert nichts - mit text3 klappt es
Serial.print(" SUPER es geht");
}

if (text3 == “Hallo Arduino”) { // mit text3 klappt es
Serial.print(" Schade so soll es nicht sein mit Text3");
Serial.println(" ");
}
}
}

strcmp

Char arrays kann man nicht mit == vergleichen.

C hat keine einfache Funktion wie == um 2 Arrays miteinander zu vergleichen. Du mußt Element für Element oder mit Vergleichsfunktion wie vorgeschlagen machen. Grüße Uwe

int text3 = "Hallo Arduino";

"Hallo Arduino" cannot be an int data type.

Should be

 char text3[] = "Hallo Arduino";

Danke AWOL das war der richtige Tipp - bin eben noch Anfänger

if (!strcmp(text2,"Hallo Arduino")){ Serial.print(" SUPER es geht"); }

AWOL: strcmp

Du solltest explizit auf == 0 abfragen. strcmp() liefert nicht true oder false zurück. Sondern 0 für Gleichheit. Und eine positive oder negative Zahl für Ungleichheit. Und negative Zahlen sind auch true!

Der Grund weshalb == nicht mit Arrays geht ist dass du damit nur die Adressen vergleichst. Array Variablen entsprechen Zeigern auf das erste Element

Du solltest explizit auf == 0 abfragen

0 == false !0 == true.

Mhh, stimmt :(

Serenifly: Mhh, stimmt :(

Das ist nicht richtig?

Hi

Nebenfrage: Warum klappt der Vergleich (ungetestet, hier so im Thread 'erlesen') mit der INT-'Kette' (0...255)(-32768...32767), und der Vergleich mit der CHAR-'Kette' (-128...127) schlägt fehl? Binär ist Alles identisch (ggf. das Ende hinter dem Text nicht ... kA), nur 1x signed, 1x unsigned.

MfG

Sehe keinen Vergleich.

postmaster-ino: Warum klappt der Vergleich (ungetestet, hier so im Thread 'erlesen') mit der INT-'Kette' (0...255), und der Vergleich mit der CHAR-'Kette' (-128...127) schlägt fehl? Binär ist Alles identisch (ggf. das Ende hinter dem Text nicht ... kA), nur 1x signed, 1x unsigned.

Wo ist das lauffähige Beispielprogramm das diese obskuren Worte erläutert?

Hi

Meine Anfrage bezieht sich auf den hier vorgestellten Sketch, wo wohl der Vergleich auf INT funktioniert, auf CHAR aber nicht. Da 'intern' die Bits identsich sind, frage ich mich 'warum'?

int text3 = "Hallo Arduino";

void loop() {
...
  if (radio.available()) {

    char text2[13] = "";
    radio.read(&text2, sizeof(text2));
...
    if (text2 == "Hallo Arduino") {     // Hier passiert nichts - mit text3 klappt es
      Serial.print(" SUPER es geht");
    }

Da es nicht um meinen Sketch geht - werde ich Euch kein kompilierbaren Sketch dazu liefern können ;)

Mit etwas Lesen des Thread wären diese obskuren Worte durchaus auffindbar gewesen - nur nebenbei angemerkt!

MfG

postmaster-ino: Mit etwas Lesen des Thread wären diese obskuren Worte durchaus auffindbar gewesen - nur nebenbei angemerkt!

In dem Thread kamen bisher weder Ketten noch Kardan oder Keilrimen vor...

Nur mal so angemerkt.

Dass die Adresse eines Strings in einen int passt und dass der Kompiler identische String Literale übereinanderlegt finde ich nicht besonders erstaunlich.

Hi

Worin besteht dann aber der Unterschied zwischen den Datentypen INT und CHAR? Sofern - ungetestet - der eine Test eben greift und der Andere eben nicht.

Viel mehr fragte ich nicht - aber vll. interpretiere ich auch einfach nur zu viel hier rein - so langsam scheint das Niveau Richtung MC.NET abzugleiten - wenn's schee macht ...

postmaster-ino: Worin besteht dann aber der Unterschied zwischen den Datentypen INT und CHAR?

Der eine hat zwei Byte, der andere ein Byte. Dieser Unterschied macht aber nichts aus wenn man

  • einen char Array (eine char* Konstante) mit einer char* Konstanten
  • oder einen Integer mit einer char* Konstanten vergleicht. Die wahrscheinlich generierten Warnings/Errors würden dir mehr erzählen.

postmaster-ino: Sofern - ungetestet - der eine Test eben greift und der Andere eben nicht.

Was hält dich vom Testen ab? Arduino kaput? Finger gebrochen? Hitze Shutdown?

postmaster-ino: Worin besteht dann aber der Unterschied zwischen den Datentypen INT und CHAR? Viel mehr fragte ich nicht - aber vll. interpretiere ich auch einfach nur zu viel hier rein - so langsam scheint das Niveau Richtung MC.NET abzugleiten - wenn's schee macht ...

Ich kenne das Niveau bei MC.NET nicht, kann also nicht beurteilen ob das nachteilig wäre.

int intTextAdr = "Hallo Arduino";

void setup() {
  Serial.begin(250000);
  char testCharArray[14];
  strcpy(testCharArray, "Hallo Arduino");
  if (testCharArray == "Hallo Arduino") {
    Serial.println(F("der Prozessor ist kaput"));
  }
  if (intTextAdr == "Hallo Arduino") {
    Serial.println(F("Konstanten werden uebereinandergelegt"));
  }
  if (!strcmp(testCharArray, "Hallo Arduino")) {
    Serial.println(F("der Inhalt ist gleich"));
  }
  printAdr(F("\"Hallo Arduino\""), (uint16_t)"Hallo Arduino");
  printInh(F("intTextAdr"), intTextAdr);
  printAdr(F("testCharArray"), (uint16_t)testCharArray);
}
void printAdr(const __FlashStringHelper* name, uint16_t value) {
  Serial.print(F("Die Adresse"));
  printGen(name, value);
}
void printInh(const __FlashStringHelper* name, uint16_t value) {
  Serial.print(F("Der Inhalt "));
  printGen(name, value);
}
void printGen(const __FlashStringHelper* name, uint16_t value) {
  Serial.print(F(" von "));
  Serial.print(name);
  Serial.print(F(" ist: \t0x"));
  Serial.println(value, HEX);
}
void loop() {}

Konstanten werden uebereinandergelegt der Inhalt ist gleich Die Adresse von "Hallo Arduino" ist: 0x217 Der Inhalt von intTextAdr ist: 0x217 Die Adresse von testCharArray ist: 0x21ED

Somwhere\CharCompareFail\CharCompareFail.ino:1:18: warning: invalid conversion from 'const char*' to 'int' [-fpermissive]
 int intTextAdr = "Hallo Arduino";
                  ^
Somwhere\CharCompareFail\CharCompareFail.ino:7:24: warning: comparison with string literal results in unspecified behaviour [-Waddress]
   if (testCharArray == "Hallo Arduino") {
                        ^
Somwhere\CharCompareFail\CharCompareFail.ino:10:21: warning: comparison with string literal results in unspecified behaviour [-Waddress]
   if (intTextAdr == "Hallo Arduino") {
                      ^

postmaster-ino:
Meine Anfrage bezieht sich auf den hier vorgestellten Sketch, wo wohl der Vergleich auf INT funktioniert, auf CHAR aber nicht.
Da ‘intern’ die Bits identsich sind, frage ich mich ‘warum’?

Vergleiche Äpfel mit Birnen!
Und verirre dich darin.

Aber ich werde das nicht mit dir diskutieren!

Testprogramm:

int  a = "Hallo";
char b = "Hallo";

void setup() 
{
  Serial.begin(9600);
  Serial.println("Start");
  Serial.println(sizeof(a));
  Serial.println(sizeof(b));

}

void loop() 
{

}

Führe es aus.
Denke über die Ausgabe nach.