Probleme Vergleich char*



  • Moin,

    ich versuche zwei array of char in einer if Abfrage zu vergleichen, leider vergeblich.

    Varible1:

    const char* subscribe_topic[] ={"/30/SensorID", 
                                    "/30/AktorID"
                                    };
    

    Variable2 wir der methode übergeben:

    void broker_callback (char* topic, byte* payload, unsigned int length) {
      char value[10] = "";
    
      for (int i = 0; i < length; i++) {
        value[i] = payload[i];
      }
      for (int i = 0; i < (sizeof(subscribe_topic)/sizeof(int)); i++){
        Serial.print("Topic =    ");
        Serial.print(topic);
        Serial.println("*");
        Serial.print("subscribe =");
        Serial.print(subscribe_topic[i]);
        Serial.println("*");
    
        if (topic == subscribe_topic[i]){
          Serial.println("Treffer");
          topic_action(i, topic, value);
        }
      }  
    }
    

    Hier noch das Printergebnis:

    Topic =    /30/AktorID*
    subscribe =/30/SensorID*
    Topic =    /30/AktorID*
    subscribe =/30/AktorID*
    

    demnach müsste der zweite Durchlauf doch ein TRUE in der IF-clauses geben?
    Ist aber nicht so.

    Hängen da noch Sonderzeichen dran?

    Danke für eure Unterstützung.
    Pf@nne


  • Mod

    Du hast die Zeiger verglichen, nicht worauf sie zeigen.

    Wenn du nicht weißt, wie man in C mit Zeichenketten umgeht, dann nutz doch die C++-Zeichenketten. Mit std::string wäre das nicht passiert. Der verhält sich, wie man es intuitiv erwartet.



  • Ich habe vorher noch nichts mit C/C++ gemacht, daher tue ich mich ein wenig schwer.

    std::string --> schaue ich mir an.

    Wie wäre der Vergleich denn richtig?

    Das könnte auch erklären warum sizeof=4 ist, obwohl der String länger ist?


  • Mod

    Pf@nne schrieb:

    Ich habe vorher noch nichts mit C/C++ gemacht, daher tue ich mich ein wenig schwer.

    Eine erste wichtige Erkenntnis wäre, dass C und C++ zwei ganz unterschiedliche Sprachen sind.

    Das ist übrigens auch eine gute Möglichkeit, schlechte Lehrbücher und Lehrer zu erkennen, wenn sie behaupten, "C/C++" zu lehren.

    Wie wäre der Vergleich denn richtig?

    Die fertige Funktion strcmp aus der C-Standardbibliothek benutzen. Oder von Hand jedes Zeichen einzeln vergleichen (nichts anderes macht strcmp). Bei std::string einfach ganz intuitiv mittels ==.

    Das könnte auch erklären warum sizeof=4 ist, obwohl der String länger ist?

    Korrekt. Wenn du auch nicht mit rohen C-Arrays umgehen kannst, wären auch hier die C++-Alternativen (std::array oder einer der vielen anderen Container, wie z.B. der sehr nützliche std::vector) besser, denn die kennen ihre Größen selber und machen keine komischen Umwandlungen durch, wenn man sie an Funktionen übergibt.



  • Ich hab es jetzt mit strcmp gelöst.

    if (strcmp(topic, subscribe_topic[i]) == 0){
    

    Ich bin mir nicht sicher ob ich den vollen c++ Umfang zu Verfügung habe,
    da ich mt der Arduino-Umgebung für µC arbeite.

    Ich komme da schritweise hinter, solange mir so nette Leute wie du helfen!!

    Danke für deine Mühe!

    Schönen Freirag Abend.


Log in to reply